Unity2D镜头对象随角色旋转,但不应

时间:2019-11-20 20:28:09

标签: c# unity3d game-development

我正在尝试学习Unity。我的目标是建立一个小行星克隆。

目前,我的角色能够飞翔,射击并向鼠标位置旋转。但是,子弹在某种程度上受玩家转身的影响。

以下是一些示例代码:

player.cs

    private void Shoot()
    {
        Instantiate(Bullet, transform);
    }

    private void FaceMouseDirection()
    {
        Vector2 direction = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
        float angle = Mathf.Atan2(direction.x, direction.y) * Mathf.Rad2Deg;
        Quaternion rotation = Quaternion.AngleAxis(angle, Vector3.back);
        transform.rotation = Quaternion.Slerp(transform.rotation, rotation, turningSpeed * Time.deltaTime);
    }

bullet.cs

    private GameObject parent;
    private Vector3 Force;

    // Use this for initialization
    void Start () 
    {
        parent = GameObject.Find("Player");
        Force = parent.transform.up * bulletSpeed;
    }

    void FixedUpdate()
    {
        transform.Translate(Force * Time.fixedDeltaTime);
    }
}

3 个答案:

答案 0 :(得分:3)

项目符号被设置为玩家的子代。子对象与父对象保持相同的旋转度。

在子弹的Start()中,您需要在设置力后从子弹中删除父项。

我应该可以做到这一点

transform.parent = null;

答案 1 :(得分:1)

首先,不要让子弹成为玩家的孩子。 (不要使用Instantiate(Bullet, transform);

第二,将子弹实例化时,将子弹的旋转和位置设置为与玩家相同。 (请使用Instantiate(Bullet, transform.position, transform.rotation);

第三,不要将子弹的移动基于玩家的变形。只需使用自己的变换即可。 (请使用Force = transform.up * bulletSpeed;代替Force = parent.transform.up * bulletSpeed

player.cs

    private void Shoot()
    {
        GameObject bullet = Instantiate(Bullet, transform.position, transform.rotation);
    }

    private void FaceMouseDirection()
    {
        Vector2 direction = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
        float angle = Mathf.Atan2(direction.x, direction.y) * Mathf.Rad2Deg;
        Quaternion rotation = Quaternion.AngleAxis(angle, Vector3.back);
        transform.rotation = Quaternion.Slerp(transform.rotation, rotation, turningSpeed * Time.deltaTime);
    }

bullet.cs

    private Vector3 Force;

    // Use this for initialization
    void Start () 
    {

        Force = -transform.right * bulletSpeed;
    }

    void FixedUpdate()
    {
        transform.Translate(Force * Time.fixedDeltaTime);
    }
}

第四,您应该考虑对子弹使用一种称为object pooling的技术,因为实例化并销毁许多近乎重复的游戏对象通常效率不高。

注意:如果在子弹上使用RigidbodyRigidbody2D,则应使用rb.MovePosition(transform.position + Force * Time.deltaTime);Time.deltaTime与{ Time.fixedDeltaTime),因为它将正确插入在调用FixedUpdate之间渲染的帧。

答案 2 :(得分:0)

这可能是因为您将项目符号实例化为对象转换的子级。 然后,当物体旋转时,子弹也会旋转。

您想在世界/根目录中实例化它们,或者如果要在层次结构中将它们分组,则可以在(0,0,0)的静态对象中实例化。

Object.Instantiate(bullet).transform.position = base.transform.position