【发布时间】:2018-06-04 11:13:56
【问题描述】:
我已经尝试了两天,但没有成功。我无法弄清楚我在哪里错过了重点。所有的导弹都在朝着目标的位置移动,但没有跟随它。位置保持不变,所有新创建的导弹都到达该点而不是跟随目标。
代码如下:
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#,显然你知道这一点。
我试图实现的是导弹应该实时跟踪目标的位置。我可以自己添加导弹的销毁代码。 注意: 请不要将此标记为重复。它不是。 游戏是二维的,其中 Y 始终是常数。垂直轴是 X,水平轴是 X。对象是 3D。这就是为什么我不能使用rigidbody2D。
编辑: 代码已编辑。导弹跟随目标并指向运动方向。如何让导弹在需要旋转的时候做圆周旋转?
【问题讨论】:
-
在我看来,目标转换不正确。它指的是一个未使用的游戏对象
-
我尝试了两种方式。使用检查器拖放目标变换并使用 target = GameObject.FindGameObjectWithTag("Target");但它不起作用。
-
代码没问题。尝试调试转换以查看它所遵循的位置
-
调试日志:(0.0, 0.0, 0.0) UnityEngine.Debug:Log(Object) HomingMissile:FixedUpdate()(在 Assets/Test/HomingMissile.cs:38)。
-
所以您现在知道当前目标始终为零。正如我所说,这个脚本遵循了错误的目标
标签: c# unity3d game-engine projectile targeting