在 Unity 中移动物理精灵
Moving a Physics Sprite in Unity
如何在 Unity 中移动物理精灵?我是像远见物理学中那样对 body 施加力,还是移动角色精灵?这就是我目前尝试移动它的方式,我得到的是:
NullReferenceException: UnityEngine.Rigidbody2D.get_velocity()
_position.x = Input.GetAxis ("Horizontal");
_position.y = Input.GetAxis ("Vertical");
if (Input.GetKeyDown(KeyCode.Space))
{
_rig.AddForce(new Vector2(_rig.velocity.x, _jumpHeight));
_rig.velocity = new Vector2(Mathf.Clamp(_rig.velocity.x, -_clampValue.x, _clampValue.x), Mathf.Clamp(_rig.velocity.y, -_clampValue.y, _clampValue.y));
}
if (Input.GetKey(KeyCode.D))
{
//_rig.AddForce(new Vector2(_moveSpeed, _rig.velocity.x));
//_rig.velocity = new Vector2(Mathf.Clamp(_rig.velocity.x, -_clampValue.x, _clampValue.x), Mathf.Clamp(_rig.velocity.y, -_clampValue.y, _clampValue.y));
_rig.velocity = new Vector2(_position.x * _moveSpeed, _rig.velocity.y);
}
if (Input.GetKey(KeyCode.A))
{
_rig.AddForce(new Vector2(-_moveSpeed, _rig.velocity.y));
_rig.velocity = new Vector2(Mathf.Clamp(_rig.velocity.x, -_clampValue.x, _clampValue.x), Mathf.Clamp(_rig.velocity.y, -_clampValue.y, _clampValue.y));
}
看来您没有将 RigidBody2D 分配给您的 sprite。
我想 _rig 在您的 Start 或 Awake 方法中是这样分配的:
_rig = GetComponent<Rigidbody2D>();
但是如果您没有为您的 GameObject 分配 Rigidbody2D,它将 return 一个空引用。这就是异常的原因。
进入编辑器,select 层次结构面板中的游戏对象,然后在检查器面板中向其添加组件 Rigidbody2D。
你加力的方式也是错误的。您需要传递一个代表移动方向的 Vector2。顺便说一句,你不能将速度限制在负值,因为速度总是正的。
总而言之,您处理输入的方式有误。您使用 Input.GetAxis 获取轴值并使用 A 和 D 键启动移动。也许它可以工作,因为 A 和 D 是默认情况下用于水平和垂直轴的键,但稍后可能会导致错误。
出于所有这些原因,我建议您以这种方式编辑代码:
float horizontal = Input.GetAxis ("Horizontal");
if (Input.GetKeyDown(KeyCode.Space))
_rig.AddForce(new Vector2(0, _jumpHeight));
if (horizontal < 0)
_rig.AddForce(new Vector2(-_moveSpeed, 0));
if (horizontal > 0)
_rig.AddForce(new Vector2(_moveSpeed, 0));
if (_rig.velocity.x > _clampValue.x)
_rig.velocity = new Vector2(_clampValue.x, _rig.velocity.y);
if (_rig.velocity.y > _clampValue.y)
_rig.velocity = new Vector2(_rig.velocity.x, _clampValue.y);
如何在 Unity 中移动物理精灵?我是像远见物理学中那样对 body 施加力,还是移动角色精灵?这就是我目前尝试移动它的方式,我得到的是:
NullReferenceException: UnityEngine.Rigidbody2D.get_velocity()
_position.x = Input.GetAxis ("Horizontal");
_position.y = Input.GetAxis ("Vertical");
if (Input.GetKeyDown(KeyCode.Space))
{
_rig.AddForce(new Vector2(_rig.velocity.x, _jumpHeight));
_rig.velocity = new Vector2(Mathf.Clamp(_rig.velocity.x, -_clampValue.x, _clampValue.x), Mathf.Clamp(_rig.velocity.y, -_clampValue.y, _clampValue.y));
}
if (Input.GetKey(KeyCode.D))
{
//_rig.AddForce(new Vector2(_moveSpeed, _rig.velocity.x));
//_rig.velocity = new Vector2(Mathf.Clamp(_rig.velocity.x, -_clampValue.x, _clampValue.x), Mathf.Clamp(_rig.velocity.y, -_clampValue.y, _clampValue.y));
_rig.velocity = new Vector2(_position.x * _moveSpeed, _rig.velocity.y);
}
if (Input.GetKey(KeyCode.A))
{
_rig.AddForce(new Vector2(-_moveSpeed, _rig.velocity.y));
_rig.velocity = new Vector2(Mathf.Clamp(_rig.velocity.x, -_clampValue.x, _clampValue.x), Mathf.Clamp(_rig.velocity.y, -_clampValue.y, _clampValue.y));
}
看来您没有将 RigidBody2D 分配给您的 sprite。
我想 _rig 在您的 Start 或 Awake 方法中是这样分配的:
_rig = GetComponent<Rigidbody2D>();
但是如果您没有为您的 GameObject 分配 Rigidbody2D,它将 return 一个空引用。这就是异常的原因。
进入编辑器,select 层次结构面板中的游戏对象,然后在检查器面板中向其添加组件 Rigidbody2D。
你加力的方式也是错误的。您需要传递一个代表移动方向的 Vector2。顺便说一句,你不能将速度限制在负值,因为速度总是正的。
总而言之,您处理输入的方式有误。您使用 Input.GetAxis 获取轴值并使用 A 和 D 键启动移动。也许它可以工作,因为 A 和 D 是默认情况下用于水平和垂直轴的键,但稍后可能会导致错误。
出于所有这些原因,我建议您以这种方式编辑代码:
float horizontal = Input.GetAxis ("Horizontal");
if (Input.GetKeyDown(KeyCode.Space))
_rig.AddForce(new Vector2(0, _jumpHeight));
if (horizontal < 0)
_rig.AddForce(new Vector2(-_moveSpeed, 0));
if (horizontal > 0)
_rig.AddForce(new Vector2(_moveSpeed, 0));
if (_rig.velocity.x > _clampValue.x)
_rig.velocity = new Vector2(_clampValue.x, _rig.velocity.y);
if (_rig.velocity.y > _clampValue.y)
_rig.velocity = new Vector2(_rig.velocity.x, _clampValue.y);