Unity Rigidbody Нажмите, чтобы переместить
Я хочу иметь сценарий, который, когда я нажимаю на мою сцену, мой игрок будет вращаться, и к нему будет добавлена сила, и он будет двигаться, пока не достигнет точки щелчка в моей сцене.
Прямо сейчас у меня это работает, используя Векторы и мой игрок переходит от одного пункта к другому. Но я хочу изменить его, чтобы я мог использовать физику и лучше понимать, как движется мой игрок. Как будто он ускорился, чтобы начать двигаться и замедляться, когда он достигает моей целевой приманки
Мой сценарий теперь выглядит так
public GameObject isActive;
public float speed;
public Ray ray;
public Rigidbody rigidBody;
public Vector3 targetPoint;
// Use this for initialization
void Start ()
{
targetPoint = transform.position;
}
// Update is called once per frame
void Update ()
{
}
void FixedUpdate()
{
if (Input.GetMouseButton(0))
{
targetPoint = Camera.main.ScreenToWorldPoint (Input.mousePosition);
ChangeRotationTarget ();
}
Quaternion targetRotation = Quaternion.LookRotation (targetPoint - transform.position);
transform.rotation = Quaternion.Slerp (transform.rotation, targetRotation, speed * Time.deltaTime);
rigidbody.position = Vector3.Lerp(transform.position, targetPoint, speed * Time.fixedDeltaTime);
}
void ChangeRotationTarget ()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Plane playerPlane = new Plane (Vector3.up, transform.position);
float hitdist = 0.0f;
if (playerPlane.Raycast (ray, out hitdist))
{
targetPoint = ray.GetPoint (hitdist);
}
}
Однако когда я запускаю это, он просто скользит из одной точки в другую. Независимо от сопротивления или массы я положил в свое твердое тело.
Может ли кто-нибудь помочь мне сделать мои изменения? Или укажи мне правильное направление
2 ответа
У меня не было времени, чтобы проверить это, но это должно быть почти то, что вы ищете. Просто примените к нему ваши коды кватерниона и вращения.
void FixedUpdate() {
if (Input.GetMouseButton(0))
{
targetPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
if (rigidBody.position != targetPoint)
{
reachedTargetPoint = false;
if (reachedTargetPoint == false)
{
GetComponent<Rigidbody>().AddForce(speed);
}
}
//zoneBeforeReachingTP should be how much units before reaching targetPoint you want to start to decrease your rigidbody velocity
if (rigidBody.position == (targetPoint - zoneBeforeReachingTP))
{
//speedReductionRate should be how much of speed you want to take off your rigidBody at the FixedUpdate time rate
rigidBody.velocity = speedReductionRate;
}
if(rigidBody.position == targetPoint)
{
rigidBody.velocity = new Vector3(0, 0, 0);
reachedTargetPoint = true;
}
ChangeRotationTarget();
}
}
Это потому, что вы модифицируете rigidbody.position
и ваша логика переопределяет физику. Вместо этого вы должны ApplyForce
каждый физический кадр, вероятно, с ForceMode.Force
или же ForceMode.Acceleration
,