如何解决在Unity中使用RigidBody2D
我的好友和我最近合作创建了一个顶视太空射击游戏,例如小行星。我们已经看了很多教程,并且已经设法与translate.Transform()
一起使用,并可以移动对象。
现在我们要使用RigidBody2D
向我们的船施加力量:
这是Unity窗口的屏幕截图:
如上面的屏幕快照所示,我们制作了一个Player Ship预制件,其中带有一个太空飞船精灵,一个圆形对撞机,一个刚体2D和一个PlayerThrust脚本。
在Thrust.cs
中:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Thrust : MonoBehaviour
{
// Thrust script components
public Rigidbody2D rigidBody; // GameObject's Rigidbody2D component
public float thrustAmount; // amount of thrust applied to be defined in unity
private float thrustInput; // float variable to keep track of user input of the 'up' arrow key/'up' axis tilt on joystick
// Start is called before the first frame update
void Start() {}
// Update is called once per frame
void Update()
{
// handle input
thrustInput = Input.GetAxis("Vertical"); // float ranging from -1.0 to +1.0
// Debug
Debug.Log(Vector2.up * thrustInput * thrustAmount);
}
// Fixed Update is called every fixed framerate frame
// use for physics
void FixedUpdate() {
// only accelerate forward
if (thrustInput > 0)
{
// Apply thrust in direction ship is facing
rigidBody.AddRelativeForce(transform.up * thrustInput * thrustAmount);
}
}
}
为什么船不移动?
Debug.Log(Vector2.up * thrustInput * thrustAmount);
输出一个有意义的数字,当按下↑按钮时,它会升到推力量,而在释放按钮时,它会返回到0.0。
解决方法
这里是一项测试,以了解发生了什么情况。 2个脚本。一个将产生一艘船(一个立方体),另一个将使用推进器。立方体快速下降时,请按住向上键一点以接合推进器。
这应该至少在2020年之前适用于Unity 5.6。
#1-
创建一个新的空白场景。确保您处于2D视图。 不做任何更改。将此脚本添加到相机(它所做的只是生成一个对象):
using System.Collections;
using UnityEngine;
public class SpawnShipTest : MonoBehaviour
{
private void Start()
{
//Create a new scene,put this script on your camera.
StartCoroutine(SpawnTestObject());
}
IEnumerator SpawnTestObject()
{
//Spawn object
var go = GameObject.CreatePrimitive(PrimitiveType.Cube);
var col = go.GetComponent<BoxCollider>();
Component.Destroy(col);
yield return new WaitForSeconds(.2f);
go.transform.position = new Vector3(0f,0f,-2f);
go.AddComponent<ShipThrustTest>();
go.AddComponent<Rigidbody2D>();
}
}
#2-
将此脚本添加到项目文件夹中的某个位置(然后按播放,然后查看“游戏窗口”):
using UnityEngine;
public class ShipThrustTest: MonoBehaviour
{
// Thrust script components
public Rigidbody2D rigidBody;
public float thrustAmount; // amount of thrust applied to be defined in unity
private float thrustInput; // float variable to keep track of user input of the 'up' arrow key/'up' axis tilt on joystick
void Start()
{
rigidBody = GetComponent<Rigidbody2D>();
thrustAmount = 10f;
}
void Update()
{
thrustInput = Input.GetAxis("Vertical");
}
void FixedUpdate()
{
if (thrustInput > 0)
{
rigidBody.AddRelativeForce(transform.up * thrustInput * thrustAmount * 2f,ForceMode2D.Force);
}
}
}
,
感谢您的帮助。
最主要的错误是我们将Rigidbody2D
与3-D对象一起使用,而不仅仅是Rigidbody
……我们被游戏为“ 2- D”游戏,即使我们的资产是3维的。
我们也从未考虑过使用rigidBody = GetComponent<Rigidbody2D>();
或使用参数,ForceMode2D.Force
。这些都是非常好的技巧。很棒的测试脚本@Kale_Surfer_Dude!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。