Jump to content
Unity Insider Forum
Helishcoffe

Methodensammlung

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 :) 

Share this post


Link to post
Share on other sites

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;
    }

}

 

  • Like 1

Share this post


Link to post
Share on other sites

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;
	}

 

Share this post


Link to post
Share on other sites

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);
    }

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×