在 Unity 中使用 RigidBody2D
Using RigidBody2D in Unity
我和我的好友最近联手制作了一个俯视图 space 射击游戏,例如小行星。我们已经看了很多教程,并且我们已经设法使用 translate.Transform()
并让我们的对象移动。
现在我们要使用 RigidBody2D
:
对我们的船施加力
这是我们Unity的截图window:
如上面的屏幕截图所示,我们使用 spaceship 精灵、圆形碰撞器、2D 刚体和 PlayerThrust 脚本制作了 Player Ship 预制件。
在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 -
将此脚本添加到项目文件夹中的某处(然后按播放,然后查看游戏 Window):
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 !
我和我的好友最近联手制作了一个俯视图 space 射击游戏,例如小行星。我们已经看了很多教程,并且我们已经设法使用 translate.Transform()
并让我们的对象移动。
现在我们要使用 RigidBody2D
:
这是我们Unity的截图window:
如上面的屏幕截图所示,我们使用 spaceship 精灵、圆形碰撞器、2D 刚体和 PlayerThrust 脚本制作了 Player Ship 预制件。
在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 -
将此脚本添加到项目文件夹中的某处(然后按播放,然后查看游戏 Window):
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 !