统一 2d 中的方向实体运动故障
Direction entity movment glitch in unity 2d
我正在使用 Unity 2D 创建游戏。我有龙要添加到场景中。龙只应该在 4 个方向中的一个方向上移动,向上、向下、向左和向右。左右移动的龙完全按照预期移动。然而,上下移动的龙有一个问题,那就是它们会以一定角度移动。所有向上移动的龙都以 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>();
}
void FixedUpdate()
{
// get horizontal input
float MoveSide = Input.GetAxis("Horizontal");
//get vertical input
float MoveVert = Input.GetAxis("Vertical");
// move horizontal
rb.velocity = new Vector3(Speed * MoveVert, rb.velocity.y);
// move vertical
rb.velocity = new Vector3(Speed * MoveSide, rb.velocity.x);
}
}
但是其他代码没有?
你已经得到向量 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 的机器上玩游戏,游戏对象的移动速度将低于 60fps。 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
我正在使用 Unity 2D 创建游戏。我有龙要添加到场景中。龙只应该在 4 个方向中的一个方向上移动,向上、向下、向左和向右。左右移动的龙完全按照预期移动。然而,上下移动的龙有一个问题,那就是它们会以一定角度移动。所有向上移动的龙都以 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>();
}
void FixedUpdate()
{
// get horizontal input
float MoveSide = Input.GetAxis("Horizontal");
//get vertical input
float MoveVert = Input.GetAxis("Vertical");
// move horizontal
rb.velocity = new Vector3(Speed * MoveVert, rb.velocity.y);
// move vertical
rb.velocity = new Vector3(Speed * MoveSide, rb.velocity.x);
}
}
但是其他代码没有?
你已经得到向量 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 的机器上玩游戏,游戏对象的移动速度将低于 60fps。 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