为了账号安全,请及时绑定邮箱和手机立即绑定

unity 2d 中的方向实体运动故障

unity 2d 中的方向实体运动故障

C#
偶然的你 2022-10-23 16:45:26
我正在 Unity 2D 中创建游戏。我有要添加到场景中的龙。龙只应该在 4 个方向中的 1 个方向上移动,向上、向下、向左和向右。左右移动的龙完全按照预期移动。然而,上下移动的龙有一个问题,就是它们移动时会倾斜。所有向上移动的龙都以 45 度角向上和向右移动。所有向下移动的龙以 45 度角向下和向左移动。起初我认为是动画师将龙移动到不同位置的问题,但我从预制件中删除了动画师组件,问题仍然存在。下面是我用来移动龙的代码。using System.Collections;using System.Collections.Generic;using UnityEngine;public class DragonMovment : MonoBehaviour {    public string Direction;    //needs to be set in the prefab    public float DragonSpeed;   //speed of dragon    Rigidbody2D rb;     public Transform Boundries;    // Use this for initialization    void Start ()    {        rb = GetComponent<Rigidbody2D>();    }    // Update is called once per frame    void FixedUpdate ()    {        float MoveRight = 1;        float MoveLeft = -1;        float MoveUp = 1;        float MoveDown = -1;        if (Direction== "R")        {            rb.velocity = new Vector3(DragonSpeed * MoveRight, rb.velocity.y);        }        if (Direction == "L")        {            rb.velocity = new Vector3(DragonSpeed * MoveLeft, rb.velocity.y);        }        if (Direction == "U")        {            rb.velocity = new Vector3(DragonSpeed * MoveUp, rb.velocity.x);        }        if (Direction == "D")        {            rb.velocity = new Vector3(DragonSpeed * MoveDown, rb.velocity.x);        }    }}编辑。那么为什么以下工作。using System.Collections;using System.Collections.Generic;using UnityEngine;public class PlayerControler : MonoBehaviour {    // speed of movment     public float Speed;    // rb    Rigidbody2D rb;    public Transform Boundries;    // Use this for initialization    void Start () {        rb = GetComponent<Rigidbody2D>();    }}但其他代码没有?
查看完整描述

1 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

你在向量 3 的 y 方向得到了速度 x


if (Direction == "U")

{

    rb.velocity = new Vector3(rb.velocity.x, DragonSpeed * MoveUp);

}

if (Direction == "D")

{

    rb.velocity = new Vector3(rb.velocity.x, DragonSpeed * MoveDown);

}

当您覆盖后续语句中的值时,它在您的播放器脚本中起作用。


    float MoveSide = Input.GetAxis("Horizontal"); //eg 1

    float MoveVert = Input.GetAxis("Vertical"); // eg 1


    // setting your x velocity incorrectly to the y (vert) velocity speed and keeping y the same velocity as start of frame

    rb.velocity = new Vector3(Speed * MoveVert, rb.velocity.y);

    // Set the y to the x value of the statement above so it is now in the correct vector and set the x to the correct hoz velocity

    rb.velocity = new Vector3(Speed * MoveSide, rb.velocity.x);


// effectively doing 

rb.velocity = new Vector3(Speed * MoveSide, Speed * MoveVert);

您还应该使用 MovePosition,因为它不会直接影响物理引擎(使用速度可能会对碰撞和触发器产生连锁反应并产生意想不到的物理效果)。您的游戏对象必须被标记为运动学,否则下面的内容将导致它们立即传送到新位置。


var movementDirection = new Vector3(Speed * MoveSide, Speed * MoveVert);

rb.MovePosition(transform.position + movementDirection * Time.deltaTime);

并且 * Time.deltaTime 确保移动对于不同的帧率是一致的。如果您在 30 fps 的机器上运行游戏,游戏对象的移动速度将低于 60 fps。Time.deltaTime 计算自上一帧以来经过的物理时间,并确保无论帧速率如何,行进的距离都是相同的。


例如,假设游戏对象每帧更新移动 1 次。在 30 fps 的机器上一秒钟后,物体将移动 30。在 60 fps 的机器上一秒钟后,物体将移动 60。


Time.deltaTime=.2s on 30 fps so 1 movement * .2 = move .2 per frame * 30 frames in the second = 60 moved

Time.deltaTime=.1s on 60 fps so 1 movement * .1 = move .1 per frame * 60 frames in the second = 60 moved



查看完整回答
反对 回复 2022-10-23
  • 1 回答
  • 0 关注
  • 132 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信