Jump to content
Unity Insider Forum

Methodensammlung


Helishcoffe

Recommended Posts

Heyho :) 

da ich immer wieder allgemeine Methoden verwende, die in Unity so nicht implementiert sind, hatte ich die Idee einen Sammelthread zu starten wo jeder gerne Funktionen posten kann, die immer mal wieder gebraucht werden. Soweit ich weiß gibt es so einen Thread noch nicht und es würde vielen das Leben glaube ich sehr erleichtern. Es sollten halt nur ein paar kleine Funktionen und nicht komplette Scripts sein, sonst könnte man dieses ja direkt als neuen Thread posten. Würde mich mal auf Eure Meinung zu so einem Thread freuen. 

Ich mache mal den Anfang. Eine Methode die ab und zu mal brauche wenn ich in Unity mit neuronalen Netzen herumexperimentiere ist Sigmoid. Unity bietet da leider nichts:

public float Sigmoid(float x)
{
	return 1F / (1 + Mathf.Exp(-x));
}

 

Wenn es genug Leute gibt, die hier etwas posten würde ich einen Link mit allen Funktionen die auch getestet sind zum Finfügen ins eigene Projekt hier auflisten :) 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Für alle die es demnächst einmal brauchen sollten, um beispielsweise einen bestimmten Winkel  bei einer Rotation zu prüfen. Hier eine Methode die auf einen Winkel von 0-360 Grad umrechnet, beispielhaft für die X-Achse (Unity 2017 notwendig).
Der Winkel bezieht sich dabei auf das globale Koordinatensystem.

using UnityEngine;
using System.Collections;

public class TestRotation : MonoBehaviour
{

    void Start()
    {
        transform.Rotate(new Vector3(200, 0, 0));
        print(transform.eulerAngles.x + " " + transform.eulerAngles.y + " " + transform.eulerAngles.z);
        print(GetRealAngleX());

        transform.rotation = Quaternion.identity;
        transform.Rotate(new Vector3(130, 0, 0));
        print(transform.eulerAngles.x + " " + transform.eulerAngles.y + " " + transform.eulerAngles.z);
        print(GetRealAngleX());
    }

    float GetRealAngleX()
    {
        float resAngle = 0;
        float angle = Vector3.SignedAngle(transform.forward, Vector3.forward, Vector3.right);
        if (angle < 0) resAngle = resAngle - angle;
        else resAngle = 360 - angle;
        return resAngle;
    }

    float GetRealAngleY()
    {
        float resAngle = 0;
        float angle = Vector3.SignedAngle(transform.right, Vector3.right, Vector3.up);
        if (angle < 0) resAngle = resAngle - angle;
        else resAngle = 360 - angle;
        return resAngle;
    }

    float GetRealAngleZ()
    {
        float resAngle = 0;
        float angle = Vector3.SignedAngle(transform.up, Vector3.up, Vector3.forward);
        if (angle < 0) resAngle = resAngle - angle;
        else resAngle = 360 - angle;
        return resAngle;
    }

}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 4 months later...

Weil ich selber immer mal wieder danach suche wie ich ein bewegtes Ziel treffen kann.

	/// <summary>
	/// Addiert zum Zielvektor eine Bewegung des Zielobjekts und berechnet den Einschlagpunkt.
	/// </summary>
	/// <param name="target">Position des Zielobjekts</param>
	/// <param name="movement">Bewegung des Zielobjekts</param>
	/// <param name="bulletSpeed">Geschwindigkeit des Projektils</param>
	/// <returns>Einschlagpunkt</returns>
	public Vector3 AimMovingTarget(Vector3 target, Vector3 movement, float bulletSpeed)
	{
		float dist = (transform.position - target).magnitude; // C
		float relSpeed = movement.magnitude / bulletSpeed; // a/b

		float beta = Vector3.Angle(transform.position - target, movement) / 180f * Mathf.PI;

		// sin(alpha) = a/b * sin(beta)
		float sinA = relSpeed * Mathf.Sin(beta);
		// gamma = pi - alpha - beta
		float gamma = Mathf.PI - (Mathf.Asin(sinA) + beta);

		// A = C * sin(alpha) / sin(gamma)
		float hitDist = dist * sinA / Mathf.Sin(gamma);

		return target + movement.normalized * hitDist;
	}

Und hier das gleiche als Approximation, falls man noch eine Beschleunigung oder andere Kräfte einfügen möchte, die nicht mehr trivial zu berechnen sind.

	/// <summary>
	/// Addiert zum Zielvektor eine Bewegung des Zielobjekts und berechnet den Einschlagpunkt.
	/// </summary>
	/// <param name="target">Position des Zielobjekts</param>
	/// <param name="movement">Bewegung des Zielobjekts</param>
	/// <param name="bulletSpeed">Geschwindigkeit des Projektils</param>
	/// <param name="increment">Schritweite der Approximation. Sollte kleiner als die Kollisionsbox des Ziels sein.</param>
	/// <returns>Ungefährer Einschlagpunkt</returns>
	public Vector3 AimMovingTarget(Vector3 target, Vector3 movement, float bulletSpeed, float increment = 0.01f)
	{
		Vector3 t = (target - transform.position);
		float time = 0;
		float lastErr = float.MaxValue;
		float err;
		do
		{
			time += increment;
			t += movement * increment;

			err = t.magnitude / bulletSpeed - time;

			if (lastErr < err)
			{
				break;
			}
			lastErr = err;
		}
		while (Mathf.Abs(err) >= increment);
		return t + transform.position;
	}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 month later...

Wenn man ne Box schnell zeichnen möchte

public static void DrawBox(Vector3 position, Vector3 halfExtends, Quaternion rotation, Color color)
    {
        Debug.DrawLine(position + rotation * new Vector3(halfExtends.x, halfExtends.y, halfExtends.z), position + rotation * new Vector3(-halfExtends.x, halfExtends.y, halfExtends.z), color);
        Debug.DrawLine(position + rotation * new Vector3(halfExtends.x, -halfExtends.y, halfExtends.z), position + rotation * new Vector3(-halfExtends.x, -halfExtends.y, halfExtends.z), color);
        Debug.DrawLine(position + rotation * new Vector3(halfExtends.x, halfExtends.y, -halfExtends.z), position + rotation * new Vector3(-halfExtends.x, halfExtends.y, -halfExtends.z), color);
        Debug.DrawLine(position + rotation * new Vector3(halfExtends.x, -halfExtends.y, -halfExtends.z), position + rotation * new Vector3(-halfExtends.x, -halfExtends.y, -halfExtends.z), color);

        Debug.DrawLine(position + rotation * new Vector3(halfExtends.x, -halfExtends.y, halfExtends.z), position + rotation * new Vector3(halfExtends.x, halfExtends.y, halfExtends.z), color);
        Debug.DrawLine(position + rotation * new Vector3(-halfExtends.x, -halfExtends.y, halfExtends.z), position + rotation * new Vector3(-halfExtends.x, halfExtends.y, halfExtends.z), color);
        Debug.DrawLine(position + rotation * new Vector3(halfExtends.x, -halfExtends.y, -halfExtends.z), position + rotation * new Vector3(halfExtends.x, halfExtends.y, -halfExtends.z), color);
        Debug.DrawLine(position + rotation * new Vector3(-halfExtends.x, -halfExtends.y, -halfExtends.z), position + rotation * new Vector3(-halfExtends.x, halfExtends.y, -halfExtends.z), color);

        Debug.DrawLine(position + rotation * new Vector3(halfExtends.x, halfExtends.y, halfExtends.z), position + rotation * new Vector3(halfExtends.x, halfExtends.y, -halfExtends.z), color);
        Debug.DrawLine(position + rotation * new Vector3(-halfExtends.x, halfExtends.y, halfExtends.z), position + rotation * new Vector3(-halfExtends.x, halfExtends.y, -halfExtends.z), color);
        Debug.DrawLine(position + rotation * new Vector3(halfExtends.x, -halfExtends.y, halfExtends.z), position + rotation * new Vector3(halfExtends.x, -halfExtends.y, -halfExtends.z), color);
        Debug.DrawLine(position + rotation * new Vector3(-halfExtends.x, -halfExtends.y, halfExtends.z), position + rotation * new Vector3(-halfExtends.x, -halfExtends.y, -halfExtends.z), color);
    }

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...