transform.lookat表现得很奇怪或者我错过了什么(unity3d c#)

时间:2017-10-03 21:57:04

标签: c# unity3d

我正在尝试从坏人中实例化一个预制件,一个火球,并在实例化时将当前玩家位置传递给火球并使用它来定位玩家的火球。火球在其transform.forward向量上翻译/向前移动。因此,火球在创建火球时应该从坏人前往玩家的位置。

我发现的是方向正在设定(通过火球上的transform.lookat()功能),但它几乎总是错误的方向。它不是90或180。关闭多少取决于玩家在坏人方面的位置。图案围绕z轴对称。

Problem in action

假设baddie位于(0,0,0):

  • 当玩家处于(0,0,10)时,火球直接朝向玩家
  • 当玩家处于(0,0,-10)时,火球远离玩家(180度。完全相反的方向。与玩家在(0,0,10)时的方向相同)< / LI>
  • 当玩家在(10,0,0)时,火球头部距离玩家90度(如果面对坏人则向右转向玩家)
  • 当玩家处于(-10,0,0)时,火球头部距离玩家90度(如果面对坏人则向左侧玩家)

当玩家在这些角度移动时,这些值会平稳移动。它只会朝着一个方向击中玩家。

我尝试了以下(其中一些可能不是必需的):

  • 重新导入所有资产
  • 在新机器上创建新项目以重现该问题。
  • 我尝试将lookat变量设置为:
    • 播放器转换
    • 玩家的向量3世界坐标(这是以下代码中的内容)
    • player.transform.position - baddie.transform.position
    • baddie.transform.position - player.transform.position

这些都会产生相同的结果。

这是我的代码。

从baddie实例化火球的代码。

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);
    }
}

1 个答案:

答案 0 :(得分:0)

错误在Transform.Translate的使用中。其辅助参数是Space参数,默认为Space.Self。您希望方向的空间与您正在翻译的空间相匹配,以便传入Space.World

// transform.forward is the transform's forward vector in "world space"
transform.Translate(transform.forward * Time.deltaTime * moveSpeed, Space.World);

或者,您可以继续使用默认Space.SelfVector3.forward而不是transform.forward

// Vector3.forward is (0,0,1). In "self space" this is "forward"
transform.Translate(Vector3.forward * Time.deltaTime * moveSpeed); // Space.Self