Unity Rigidbody2d.addforce 施加力后不会改变方向
Unity Rigidbody2d.addforce wont change direction after force is applied
遇到一个 2D 游戏 (space) 问题,我正在尝试使用 RB2D 和 addforce 移动玩家。好像可以同时选择两个方向。如果我按下,播放器会下降,但当按下时,它不会上升,但会停止。与 Left/Right 相同。重力设置为 0。两个对象都有一个 rigidbody2d,我需要动态以允许游戏中的“弹跳”和其他物理。
- 始终存在的对象(动作脚本)
- Player Sprite(精灵)
我希望玩家能够上下左右移动。我真的同意它有减缓效果,但不是必需的。 (如果你松开按键,它会因摩擦而变慢)
我的播放器设置为分层格式,因为这是多人游戏并且父对象始终在游戏中。
我试过以下方法
-在两者上或在每个上交换动态+运动学。
-添加力、变换、速度等。
-调整摩擦力,阻力等。
- 已检查调试 x/y 在游戏中施加力,但玩家在第一次移动后不会向相反方向移动。
我已经上传文件到github here.
玩家移动
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class PlayerUnit : NetworkBehaviour {
//float speed = .5F;
float rotationSpeed = 50.0F;
float xMin;
float xMax;
float yMin;
float yMax;
// configuration parameters
[Header("Player")]
[SerializeField] float moveSpeed = .5f;
[SerializeField] float padding = 1f;
[SerializeField] int health = 200;
[SerializeField] AudioClip deathSound;
[SerializeField] [Range(0, 1)] float deathSoundVolume = 0.75f;
[SerializeField] AudioClip shootSound;
[SerializeField] [Range(0, 1)] float shootSoundVolume = 0.25f;
Rigidbody2D rb;
void Start () {
rb = this.GetComponent<Rigidbody2D>();
}
void Update () {
if( hasAuthority == false )
{
return;
}
if ( Input.GetKeyDown(KeyCode.Space) )
{
this.transform.Translate( 0, 1, 0 );
}
}
private void FixedUpdate()
{
if (true)
{
float leftright = Input.GetAxis("Horizontal");
float updown = Input.GetAxis("Vertical");
float xForce = leftright * moveSpeed * Time.deltaTime;
float yForce = updown * moveSpeed * Time.deltaTime;
Vector2 force = new Vector2(xForce, yForce);
rb.AddForce(force);
Debug.Log("xForce : " + xForce + " yForce : " + yForce);
//float leftright = Input.GetAxis("Horizontal") * moveSpeed;
//float updown = Input.GetAxis("Vertical") * moveSpeed;
////rb.MovePosition(rb.position + new Vector2(1, 0) * leftright);
//rb.MovePosition(transform.position + (transform.right * leftright + transform.up * updown) * moveSpeed);
//rb.MovePosition(rb.position + new Vector2(0, 1) * updown);
}
}
}
您的代码没问题,您只需要删除 PlayerParentObject
的子项上的 Rigidbody2D
。播放器上唯一的 Rigidbody2D
应该与 Player Unit
脚本在同一个游戏对象上。
遇到一个 2D 游戏 (space) 问题,我正在尝试使用 RB2D 和 addforce 移动玩家。好像可以同时选择两个方向。如果我按下,播放器会下降,但当按下时,它不会上升,但会停止。与 Left/Right 相同。重力设置为 0。两个对象都有一个 rigidbody2d,我需要动态以允许游戏中的“弹跳”和其他物理。
- 始终存在的对象(动作脚本)
- Player Sprite(精灵)
我希望玩家能够上下左右移动。我真的同意它有减缓效果,但不是必需的。 (如果你松开按键,它会因摩擦而变慢)
我的播放器设置为分层格式,因为这是多人游戏并且父对象始终在游戏中。
我试过以下方法 -在两者上或在每个上交换动态+运动学。 -添加力、变换、速度等。 -调整摩擦力,阻力等。 - 已检查调试 x/y 在游戏中施加力,但玩家在第一次移动后不会向相反方向移动。
我已经上传文件到github here.
玩家移动
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class PlayerUnit : NetworkBehaviour {
//float speed = .5F;
float rotationSpeed = 50.0F;
float xMin;
float xMax;
float yMin;
float yMax;
// configuration parameters
[Header("Player")]
[SerializeField] float moveSpeed = .5f;
[SerializeField] float padding = 1f;
[SerializeField] int health = 200;
[SerializeField] AudioClip deathSound;
[SerializeField] [Range(0, 1)] float deathSoundVolume = 0.75f;
[SerializeField] AudioClip shootSound;
[SerializeField] [Range(0, 1)] float shootSoundVolume = 0.25f;
Rigidbody2D rb;
void Start () {
rb = this.GetComponent<Rigidbody2D>();
}
void Update () {
if( hasAuthority == false )
{
return;
}
if ( Input.GetKeyDown(KeyCode.Space) )
{
this.transform.Translate( 0, 1, 0 );
}
}
private void FixedUpdate()
{
if (true)
{
float leftright = Input.GetAxis("Horizontal");
float updown = Input.GetAxis("Vertical");
float xForce = leftright * moveSpeed * Time.deltaTime;
float yForce = updown * moveSpeed * Time.deltaTime;
Vector2 force = new Vector2(xForce, yForce);
rb.AddForce(force);
Debug.Log("xForce : " + xForce + " yForce : " + yForce);
//float leftright = Input.GetAxis("Horizontal") * moveSpeed;
//float updown = Input.GetAxis("Vertical") * moveSpeed;
////rb.MovePosition(rb.position + new Vector2(1, 0) * leftright);
//rb.MovePosition(transform.position + (transform.right * leftright + transform.up * updown) * moveSpeed);
//rb.MovePosition(rb.position + new Vector2(0, 1) * updown);
}
}
}
您的代码没问题,您只需要删除 PlayerParentObject
的子项上的 Rigidbody2D
。播放器上唯一的 Rigidbody2D
应该与 Player Unit
脚本在同一个游戏对象上。