Wie man ein Objekt suchen und zu verlangsamen, zu stoppen, die genau auf einer bestimmten position?

Einführung

Ich bin gerade dabei ein script zu erstellen (C# script in Unity), welche Steuerelemente Punkt und Klick-Verhalten für ein GameObject.

Im wesentlichen wird der Spieler - in der end - Kontrolle ein hot air balloon, indem Sie einfach auf den Bildschirm, wobei das Objekt starten, um zu beschleunigen und bewegen sich auf die position des click. Wenn in einem bestimmten Abstand von der Klick-position, der hot air Ballon sollte dann starten, um zu beschleunigen in die entgegengesetzte Richtung (also Schubbetrieb) und zu einem kompletten Stillstand kommen genau an der position des Klicks.

Ich habe bereits eine voll funktionsfähige und kommentierte script (gefunden an der Unterseite von diesem post), die bewegt sich einfach ein GameObject in Richtung der position von einem Klick auf eine Konstante Geschwindigkeit, dann, wenn innerhalb einer bestimmten Entfernung, beginnt sich zu verlangsamen bis stoppen auf den Punkt.

Habe ich auch erstellt eine separat und voll funktionsfähiges script, das bewegt sich auf die position eines auf beim beschleunigen (immer diese Art von Asteroiden schob Verhalten). Diese finden Sie ebenfalls am unteren Rand der post.

Das Problem

Nun das problem, das ich bin vor ist, dass ich gearbeitet habe nun schon eine ganze Weile eine Lösung zu finden, wo Sie diese beiden Verhaltensweisen und implementieren Sie als ein funktionierendes Skript, das ist, mit dem Heißluftballon die Beschleunigung Verhalten, während auch die Verlangsamung und das stoppen an eine Zielposition, genau wie das visual Beispiel das hier gefunden:

Visual Ankunft Verhalten Demonstration

Die Frage

Meine Frage ist dann:

wie können Sie die Ankunft Verhalten nicht nur mit konstanter Geschwindigkeit, aber die Beschleunigung enthalten, die in der Gleichung als gut? Ich habe versucht, die Forschung zu diesem problem sowie das Experimentieren mit meiner eigenen Lösungen, aber nichts, was ich tun scheint zu funktionieren, ganz so, wie es sollte.

Skript Anhänge

Punkt und klicken Sie auf die Bewegung bei konstanter Geschwindigkeit mit der Ankunft Verhalten

using UnityEngine;
using System.Collections;

public class PlayerControl : MonoBehaviour 
{
    //Fields
    Transform cachedTransform;
    Vector3 currentMovementVector;
    Vector3 lastMovementVector;
    Vector3 currentPointToMoveTo;
    Vector3 velocity;
    int movementSpeed;

    Vector3 clickScreenPosition;
    Vector3 clickWorldPosition;

    float slowingDistance = 8.0f;

    Vector3 desiredVelocity;

    float maxSpeed = 1000.0f;

    //Use this for initialization
    void Start () 
    {
        cachedTransform = transform;
        currentMovementVector = new Vector3(0, 0);
        movementSpeed = 50;
        currentPointToMoveTo = new Vector3(0, 0);
        velocity = new Vector3(0, 0, 0);
    }

    //Update is called once per frame
    void Update () 
    {
        //Retrive left click input
        if (Input.GetMouseButtonDown(0))
        {
            //Retrive the click of the mouse in the game world
            clickScreenPosition = Input.mousePosition;

            clickWorldPosition = Camera.main.ScreenToWorldPoint(new      Vector3(clickScreenPosition.x, clickScreenPosition.y, 0));
            currentPointToMoveTo = clickWorldPosition;

            currentPointToMoveTo.z = 0;

            //Calculate the current vector between the player position and the click
            Vector3 currentPlayerPosition = cachedTransform.position;

            //Find the angle (in radians) between the two positions (player position and click position)
            float angle = Mathf.Atan2(clickWorldPosition.y - currentPlayerPosition.y, clickWorldPosition.x - currentPlayerPosition.x);

            //Find the distance between the two points
            float distance = Vector3.Distance(currentPlayerPosition, clickWorldPosition);

            //Calculate the components of the new movemevent vector
            float xComponent = Mathf.Cos(angle) * distance;
            float yComponent = Mathf.Sin(angle) * distance;

            //Create the new movement vector
            Vector3 newMovementVector = new Vector3(xComponent, yComponent, 0);
            newMovementVector.Normalize();

            currentMovementVector = newMovementVector;
        }

        float distanceToEndPoint = Vector3.Distance(cachedTransform.position, currentPointToMoveTo);

        Vector3 desiredVelocity = currentPointToMoveTo - cachedTransform.position;

        desiredVelocity.Normalize();

        if (distanceToEndPoint < slowingDistance)
        {
            desiredVelocity *= movementSpeed * distanceToEndPoint/slowingDistance;
        }
        else
        {
            desiredVelocity *= movementSpeed;
        }

        Vector3 force = (desiredVelocity - currentMovementVector);
        currentMovementVector += force;

        cachedTransform.position += currentMovementVector * Time.deltaTime;
    }
}

Punkt und klicken Sie auf Bewegung mit Beschleunigung, aber keine Ankunft Verhalten

using UnityEngine;
using System.Collections;

public class SimpleAcceleration : MonoBehaviour 
{
    Vector3 velocity;
    Vector3 currentMovementVector;

    Vector3 clickScreenPosition;
    Vector3 clickWorldPosition;

    Vector3 currentPointToMoveTo;
    Transform cachedTransform;

    float maxSpeed;

    //Use this for initialization
    void Start () 
    {
        velocity = Vector3.zero;
        currentMovementVector = Vector3.zero;
        cachedTransform = transform;
        maxSpeed = 100.0f;
    }

    //Update is called once per frame
    void Update () 
    {
        //Retrive left click input
        if (Input.GetMouseButtonDown(0))
        {
            //Retrive the click of the mouse in the game world
            clickScreenPosition = Input.mousePosition;

            clickWorldPosition = Camera.main.ScreenToWorldPoint(new Vector3(clickScreenPosition.x, clickScreenPosition.y, 0));
            currentPointToMoveTo = clickWorldPosition;

            //Reset the z position of the clicking point to 0
            currentPointToMoveTo.z = 0;

            //Calculate the current vector between the player position and the click
            Vector3 currentPlayerPosition = cachedTransform.position;

            //Find the angle (in radians) between the two positions (player position and click position)
            float angle = Mathf.Atan2(clickWorldPosition.y - currentPlayerPosition.y, clickWorldPosition.x - currentPlayerPosition.x);

            //Find the distance between the two points
            float distance = Vector3.Distance(currentPlayerPosition, clickWorldPosition);

            //Calculate the components of the new movemevent vector
            float xComponent = Mathf.Cos(angle) * distance;
            float yComponent = Mathf.Sin(angle) * distance;

            //Create the new movement vector
            Vector3 newMovementVector = new Vector3(xComponent, yComponent, 0);
            newMovementVector.Normalize();

            currentMovementVector = newMovementVector;
        }

        //Calculate velocity
        velocity += currentMovementVector * 2.0f * Time.deltaTime;

        //If the velocity is above the allowed limit, normalize it and keep it at a constant max speed when moving (instead of uniformly accelerating)
        if (velocity.magnitude >= (maxSpeed * Time.deltaTime))
        {
            velocity.Normalize();
            velocity *= maxSpeed * Time.deltaTime;
        }

        //Apply velocity to gameobject position
        cachedTransform.position += velocity;
    }
}
  • Das ist nicht AI, sondern-control-Theorie. Ich habe das tag entfernt.
InformationsquelleAutor CodingBeagle | 2012-06-04
Schreibe einen Kommentar