尝试编写 C# 代码使导弹跟随 Unity 中的玩家

Trying to write a C# code to make a missile follow the player in Unity

我试了两天都没有成功。我不知道我错过了什么。所有的导弹都朝着目标的位置移动,而不是跟随它。位置保持不变,所有新创建的导弹都来到这一点,而不是跟随目标。

代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HomingMissile : MonoBehaviour
{
    private GameObject target; //changed to private
    private Rigidbody rb;
    public float rotationSpeed;
    public float speed;

Quaternion rotateToTarget;
Vector3 direction;

private void Start()
{
    target = GameObject.FindGameObjectWithTag("Player"); //uncommented this
    rb = GetComponent<Rigidbody>();
}

private void FixedUpdate()
{
    //made some modifications
    Vector3 direction = (target.transform.position - transform.position).normalized;
    float angle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg;//interchanged x and z
    Quaternion rotateToTarget = Quaternion.Euler(0, angle, 0);
    transform.rotation = Quaternion.Slerp(transform.rotation, rotateToTarget, Time.deltaTime * rotationSpeed);
    Vector3 deltaPosition = speed * direction * Time.deltaTime;
    rb.MovePosition(transform.position + deltaPosition);

}

}

我使用检查器选择了目标(变换)。 我正在使用 Unity 和 C# 显然你知道。

我想要实现的是导弹应该实时跟随目标的位置。我可以自己添加导弹的销毁代码。 注: 请不要将其标记为重复项。它不是。 游戏是 2D,其中 Y 始终不变。垂直轴是 X,水平轴是 X。对象是 3D。这就是我不能使用 rigidbody2D 的原因。

编辑: 代码已编辑。导弹跟随目标并指向运动方向。如何让导弹在需要旋转的时候做圆周旋转?

首先,考虑:

请改用 rigidbody.movePosition()rigidbody.moveRotation()。这是一个例子:

Vector3 dir = (target.transform.position - transform.position).normalized;
Vector3 deltaPosition = speed * dir * Time.deltaTime;
rb.MovePosition(transform.position + deltaPosition);

亲自尝试 rigidbody.MoveRotation() 进行练习。

最后了解到导弹的寻的实现方式有很多种。 Here's one that is commonly used in real life.

编辑:我不推荐使用 rb.addForce(),因为如果你尝试一下,你会发现它太不确定了。