【问题标题】:Why does my GameObject returns back to a certain z-position when Joystick is let go?为什么松开操纵杆时我的游戏对象会返回到某个 z 位置?
【发布时间】:2019-10-11 16:06:31
【问题描述】:

我正在统一开展一个小项目。这是一个自上而下的游戏,其角色由操纵杆控制。当我运行游戏时,我的角色在 z 位置开始 -90,应该是 0。但是当我将操纵杆移动到我希望它运行的方向时它工作正常,这意味着它面向它运行的方向.但是,如果我放开操纵杆,角色会在 z 位置弹回 -90,我试图弄清楚它为什么这样做并防止它发生。

我在这里寻找教程视频和一些帖子,但没有一个回答我的问题。我还尝试删除我的 Mathf.Atan2 公式中的“-90f”,但是当我这样做时,它在 z 位置上旋转了 90 度。意思是,当我将操纵杆垂直向下时,角色会向右旋转。

这是我的代码:

public class PlayerController : MonoBehaviour
{

    public static PlayerController instance;

    public Rigidbody2D rb;
    public Joystick joystick;

    private float moveSpeed = 2.5f;
    Vector2 movement;


    // Update is called once per frame
    void Update()
    {
        movement.x = joystick.Horizontal;
        movement.y = joystick.Vertical;
    }

    void FixedUpdate()
    {
        rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime);
        float angle = Mathf.Atan2(movement.y, movement.x) * Mathf.Rad2Deg - 90f;
        transform.rotation = Quaternion.Euler(new Vector3(0f, 0f, angle));
    }

我希望我的角色在游戏开始时在 z 位置从 0 开始,并且在松开操纵杆之前让角色停留并面向操纵杆的方向,而不是在 z 位置旋转回 -90 .

【问题讨论】:

  • 几张显示当前和所需角色动作(带有轴)的图像将对我们有所帮助。另外,您使用的是 2D 还是 3D 物理?
  • 我相信您的回弹问题是您正在根据当前运动检查和更新角度。这在您移动时有效,但在您停止时计算 Mathf.Atan2(0,0) * Mathf.Rad2Deg-90f;。然后向着旋转。
  • 最好仅在自上次更新后移动或位置发生变化时才更新角度。
  • @Immersive Im 使用 2D 物理
  • @TheLazyScripter 我没有想到,我会尝试你的建议,如果有效,我会回来。

标签: c# unity3d


【解决方案1】:

感谢@TheLazyScripter,我能够重新编码我的脚本并让我的角色做我需要它做的事情。我只是忽略了它在 FixedUpdate 上,因此即使我停止操纵杆它也会继续调用它。我仍然是编程的菜鸟,过去一周我一直在学习,我没有休息。无论如何,这就是我对代码所做的:

void Update()
    {
        if (joystick.Horizontal >= .1f || joystick.Horizontal <= -.1f)
        {
            movement.x = joystick.Horizontal;
            MoveCharacter();
        }
        else
        {
            movement.x = 0f;
            angle = 0f;
        }

        if (joystick.Vertical >= .1f || joystick.Vertical <= -.1f)
        {
            movement.y = joystick.Vertical;
            MoveCharacter();
        }
        else
        {
            movement.y = 0f;
            angle = 0f;
        }
    }

    void MoveCharacter()
    {
        rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime);
        angle = Mathf.Atan2(movement.y, movement.x) * Mathf.Rad2Deg - 90f;
        transform.rotation = Quaternion.Euler(new Vector3(0f, 0f, angle));
    }

希望这可以帮助可能有同样问题的人。我怀疑有人会遇到同样的问题,但我希望它有所帮助。 :D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多