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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anzupassen das erste Skript:
Einführen, die eine variable
velocity
, wie in dem zweiten Skript. Setzen Sie diese gleichmovementSpeed
imStart()
, und verwenden Sie nichtmovementSpeed
danach. fahren Sie nicht Fort, bis diese optimal funktioniert.Nun vorstellen Beschleunigung:
Je nachdem, wie Sie wollen, der Bewegung erscheinen, Sie würde entweder wollen die Konstante Geschwindigkeit-Gleichungen oder diese Gleichungen. Konstante Geschwindigkeit wäre einfacher.
Beispiel: Sie könnten, teilen Sie den Abstand zwischen dem Ursprung und Ziel 2. Dann verwenden Sie die Mathematik zu beschleunigen, auf halbem Weg, dann verlangsamen sich.