UNITY 2D:玩家在按住 space/mousebutton 时飞行
UNITY 2D: Player flying when space/mousebutton is holded
所以基本上我需要我的角色在按下 space
或 mousebutton
时上升。我在 gameobject
(播放器)中添加了 rigbody 2d 和 box colider 2d。问题是当我点击 space
或 mousebutton
它只是跳跃而不是不断地 向上移动。
这是我的代码:
using UnityEngine;
using System.Collections;
public class PixelMovement : MonoBehaviour {
Vector3 velocity = Vector3.zero;
public Vector3 PressVelocity;
public float maxSpeed = 5f;
public float fowardSpeed = 1f;
public float jumpForce;
bool didPress = false;
// Use this for initialization
void Start () {
}
//Do Graphic & Input updates
void Update()
{
if (Input.GetKey(KeyCode.Space) || Input.GetMouseButton(0))
{
didPress = true;
}
}
//Do physics engine updates here
void FixedUpdate()
{
velocity.x = fowardSpeed;
if (didPress == true)
{
didPress = false;
velocity += PressVelocity * Time.deltaTime *jumpForce;
}
velocity = Vector3.ClampMagnitude(velocity, maxSpeed);
transform.position += velocity * Time.deltaTime;
}
}
if (Input.GetKey(KeyCode.Space) || Input.GetMouseButton(0))
{
didPress = true;
}
else
{
didPress = false;
}
并从 FixedUpdate()
函数中删除 didPress = false;
编辑: 好的,等等,我刚刚注意到您在 FixedUpdate()
中更新了 transform.position,这并不是一个好主意。当你这样做时,你基本上将你的对象从一个位置传送到另一个位置,而忽略了各种物理(这可能是你使用 FixedUpdate() 的原因)。当您的脚本与其他对象发生碰撞时,会给您带来奇怪的结果。查找有关使用 RigidBodies 进行适当的物理感知运动的教程,或者将所有代码移动到 Update()
因为现在您可能有一些帧不移动对象而其他帧移动两倍距离.之所以会发生这种情况,是因为 FixedUpdate()
可能会在一帧中执行任意次数(包括 0 次),具体取决于设置。 FixedUpdate 默认每秒稳定运行 50 次,而 Update 默认每秒大约运行 60 次(在移动设备 30 上)。最后,在 FixedUpdate 中永远不要使用 Time.deltaTime
,使用 Time.fixedDeltaTime
:
Time.deltaTime
大约等于 1 / 60 秒(1 帧持续时间)
Time.fixedDeltaTime
大约是 1 / 50 秒(1 物理更新持续时间)
如果您使用重力和 RigitBody2D 的质量。我建议你使用 RigitBody2D.Addforce() 方法来跳跃你的角色,因为如果你只是改变角色的位置,重力会立即将他降到地面
这段代码创建了 "rocketman" 的效果,当用户按住空格键时它会起飞:
using UnityEngine;
using System.Collections;
public class jumpAntigravity : MonoBehaviour {
Vector2 upForce;
void Start () {
//Up force set to double of gravity
upForce = new Vector2(0, 9.8f*2);
}
void Update () {
if (Input.GetKey(KeyCode.Space))
{
print("Spacebar is down");
GetComponent<Rigidbody2D>().AddForce(upForce);
}
}
}
好的,这对我有用。感谢大家的帮助:)
using UnityEngine;
using System.Collections;
public class PixelMovement : MonoBehaviour {
public float playerSpeed;
public Vector3 gravity;
public float maxSpeed = 5f;
Vector3 velocity = Vector3.zero;
public float fowardSpeed = 1f;
bool didPress = false;
void Update()
{
if (Input.GetKey(KeyCode.Space) || Input.GetMouseButton(0))
{
didPress = true;
}
else
{
didPress = false;
}
}
void FixedUpdate()
{
velocity.x = fowardSpeed;
transform.position += velocity * Time.deltaTime;
if (didPress == true)
{
float amntToMove1 = playerSpeed * Time.deltaTime;
transform.Translate(Vector3.up * amntToMove1);
}
velocity = Vector3.ClampMagnitude(velocity, maxSpeed);
transform.position += velocity * Time.deltaTime;
}
}
FixedUpdate可以连续每帧调用多次。这基于您项目的物理设置。您可以对其进行编辑以增加或减少物理学的准确性。
Update 每帧只调用 1 次。
所以你想避免在 FixedUpdate 中做逻辑。如果要移动刚体,请使用 MovePosition。
来自 Unity 文档:如果在 Rigidbody 上启用了 Rigidbody 插值,则调用 Rigidbody.MovePosition 会导致渲染的任何中间帧中两个位置之间的平滑过渡。如果你想在每个 FixedUpdate 中连续移动一个刚体,应该使用这个。
所以基本上我需要我的角色在按下 space
或 mousebutton
时上升。我在 gameobject
(播放器)中添加了 rigbody 2d 和 box colider 2d。问题是当我点击 space
或 mousebutton
它只是跳跃而不是不断地 向上移动。
这是我的代码:
using UnityEngine;
using System.Collections;
public class PixelMovement : MonoBehaviour {
Vector3 velocity = Vector3.zero;
public Vector3 PressVelocity;
public float maxSpeed = 5f;
public float fowardSpeed = 1f;
public float jumpForce;
bool didPress = false;
// Use this for initialization
void Start () {
}
//Do Graphic & Input updates
void Update()
{
if (Input.GetKey(KeyCode.Space) || Input.GetMouseButton(0))
{
didPress = true;
}
}
//Do physics engine updates here
void FixedUpdate()
{
velocity.x = fowardSpeed;
if (didPress == true)
{
didPress = false;
velocity += PressVelocity * Time.deltaTime *jumpForce;
}
velocity = Vector3.ClampMagnitude(velocity, maxSpeed);
transform.position += velocity * Time.deltaTime;
}
}
if (Input.GetKey(KeyCode.Space) || Input.GetMouseButton(0))
{
didPress = true;
}
else
{
didPress = false;
}
并从 FixedUpdate()
函数中删除 didPress = false;
编辑: 好的,等等,我刚刚注意到您在 FixedUpdate()
中更新了 transform.position,这并不是一个好主意。当你这样做时,你基本上将你的对象从一个位置传送到另一个位置,而忽略了各种物理(这可能是你使用 FixedUpdate() 的原因)。当您的脚本与其他对象发生碰撞时,会给您带来奇怪的结果。查找有关使用 RigidBodies 进行适当的物理感知运动的教程,或者将所有代码移动到 Update()
因为现在您可能有一些帧不移动对象而其他帧移动两倍距离.之所以会发生这种情况,是因为 FixedUpdate()
可能会在一帧中执行任意次数(包括 0 次),具体取决于设置。 FixedUpdate 默认每秒稳定运行 50 次,而 Update 默认每秒大约运行 60 次(在移动设备 30 上)。最后,在 FixedUpdate 中永远不要使用 Time.deltaTime
,使用 Time.fixedDeltaTime
:
Time.deltaTime
大约等于 1 / 60 秒(1 帧持续时间)
Time.fixedDeltaTime
大约是 1 / 50 秒(1 物理更新持续时间)
如果您使用重力和 RigitBody2D 的质量。我建议你使用 RigitBody2D.Addforce() 方法来跳跃你的角色,因为如果你只是改变角色的位置,重力会立即将他降到地面
这段代码创建了 "rocketman" 的效果,当用户按住空格键时它会起飞:
using UnityEngine;
using System.Collections;
public class jumpAntigravity : MonoBehaviour {
Vector2 upForce;
void Start () {
//Up force set to double of gravity
upForce = new Vector2(0, 9.8f*2);
}
void Update () {
if (Input.GetKey(KeyCode.Space))
{
print("Spacebar is down");
GetComponent<Rigidbody2D>().AddForce(upForce);
}
}
}
好的,这对我有用。感谢大家的帮助:)
using UnityEngine;
using System.Collections;
public class PixelMovement : MonoBehaviour {
public float playerSpeed;
public Vector3 gravity;
public float maxSpeed = 5f;
Vector3 velocity = Vector3.zero;
public float fowardSpeed = 1f;
bool didPress = false;
void Update()
{
if (Input.GetKey(KeyCode.Space) || Input.GetMouseButton(0))
{
didPress = true;
}
else
{
didPress = false;
}
}
void FixedUpdate()
{
velocity.x = fowardSpeed;
transform.position += velocity * Time.deltaTime;
if (didPress == true)
{
float amntToMove1 = playerSpeed * Time.deltaTime;
transform.Translate(Vector3.up * amntToMove1);
}
velocity = Vector3.ClampMagnitude(velocity, maxSpeed);
transform.position += velocity * Time.deltaTime;
}
}
FixedUpdate可以连续每帧调用多次。这基于您项目的物理设置。您可以对其进行编辑以增加或减少物理学的准确性。
Update 每帧只调用 1 次。
所以你想避免在 FixedUpdate 中做逻辑。如果要移动刚体,请使用 MovePosition。
来自 Unity 文档:如果在 Rigidbody 上启用了 Rigidbody 插值,则调用 Rigidbody.MovePosition 会导致渲染的任何中间帧中两个位置之间的平滑过渡。如果你想在每个 FixedUpdate 中连续移动一个刚体,应该使用这个。