【发布时间】:2017-10-03 21:57:03
【问题描述】:
我正在尝试从一个坏人实例化一个预制件,一个火球,并在实例化时将当前玩家位置传递给火球,并使用它来将火球瞄准玩家。火球在其 transform.forward 向量上平移/移动。因此,火球应该在火球创建时从坏人朝向玩家的位置。
我发现正在设置方向(通过火球上的transform.lookat() 函数),但它几乎总是错误的方向。这不是 90 或 180 折。它偏离多少取决于玩家相对于坏人的位置。图案围绕 z 轴对称。
假设坏人在 (0,0,0):
- 当玩家位于 (0,0,10) 时,火球会直接朝玩家飞去
- 当玩家在 (0,0,-10) 时,火球会远离玩家(180 度。完全相反的方向。与玩家在 (0,0,10) 时的方向相同)
- 当玩家位于 (10,0,0) 时,火球会朝玩家的方向 90 度(如果面对坏人,则向玩家右侧)
- 当玩家在 (-10,0,0) 时,火球会朝玩家 90 度的方向飞去(如果面对坏人,火球会朝左边的玩家)
当玩家通过这些角度时,这些值会平稳移动。它只会向一个方向击中玩家。
我尝试了以下方法(其中一些可能不是必需的):
- 重新导入所有资产
- 在新机器上创建新项目以重现该问题。
- 我尝试将
lookat变量设置为:- 玩家变换
- 玩家的矢量 3 世界坐标(这是下面代码中的内容)
player.transform.position - baddie.transform.positionbaddie.transform.position - player.transform.position
这些都产生相同的结果。
这是我的代码。
从坏人那里实例化火球的代码。
public class Baddie : MonoBehaviour {
public GameObject fireballPrefab;
public GameObject playerGameObject;
public float countDownForFireball;
private float currentCountDownForFireball;
void Start () {
playerGameObject = GameObject.FindGameObjectWithTag("Player");
currentCountDownForFireball = 0;
}
void Update () {
if(currentCountDownForFireball <= 0)
{
GameObject newFireball = GameObject.Instantiate(fireballPrefab, transform.position, Quaternion.identity);
newFireball.GetComponent<Fireball>().SetTarget(playerGameObject.transform.position);
currentCountDownForFireball = countDownForFireball;
}
else
{
currentCountDownForFireball -= Time.deltaTime;
}
}
}
火球上的代码
public class Fireball : MonoBehaviour {
private float moveSpeed;
private Vector3 target;
// Use this for initialization
void Start () {
moveSpeed = 15f;
}
// Update is called once per frame
void Update (){
transform.Translate(transform.forward * Time.deltaTime * moveSpeed);
}
public void SetTarget(Vector3 newTarget){
target = newTarget;
transform.LookAt(target);
}
}
【问题讨论】: