C# 统一使用刚体2d
我和我的朋友最近合作开发了一款俯视空间射击游戏,比如《小行星》。我们已经看了很多教程,我们已经成功地使用了C# 统一使用刚体2d,c#,unity3d,game-physics,rigid-bodies,C#,Unity3d,Game Physics,Rigid Bodies,我和我的朋友最近合作开发了一款俯视空间射击游戏,比如《小行星》。我们已经看了很多教程,我们已经成功地使用了translate.Transform(),并移动了我们的对象 现在我们想用刚体2d对我们的船施力: 以下是我们Unity窗口的屏幕截图: 如上面的截图所示,我们制作了一个带有飞船精灵、圆形碰撞器、刚体2D和玩家推力脚本的玩家飞船预制件 在推力.cs中: 使用系统集合; 使用System.Collections.Generic; 使用UnityEngine; 公共阶级主旨:单一行为 { /
translate.Transform()
,并移动了我们的对象
现在我们想用刚体2d
对我们的船施力:
以下是我们Unity窗口的屏幕截图:
如上面的截图所示,我们制作了一个带有飞船精灵、圆形碰撞器、刚体2D和玩家推力脚本的玩家飞船预制件
在推力.cs
中:
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共阶级主旨:单一行为
{
//推力脚本组件
public Rigidbody2D rigidBody;//游戏对象的Rigidbody2D组件
公共浮动推力量;//应用于unity中定义的推力量
专用浮点输入;//浮点变量,用于跟踪用户输入的“向上”箭头键/“向上”轴在操纵杆上的倾斜
//在第一帧更新之前调用Start
void Start(){}
//每帧调用一次更新
无效更新()
{
//处理输入
PurchInput=Input.GetAxis(“垂直”);//浮动范围从-1.0到+1.0
//调试
Debug.Log(Vector2.up*strustinput*strustamount);
}
//每个固定帧速率帧调用固定更新
//用于物理
void FixedUpdate(){
//只会加速前进
如果(输入>0)
{
//向船舶所面对的方向施加推力
刚体.AddRelativeForce(transform.up*推力输入*推力量);
}
}
}
船为什么不动
Debug.Log(Vector2.up*strustinput*strustamount)代码>输出一个有意义的数字,当↑ 按钮被按下,当按钮被释放时返回到0.0。下面是一个测试,看看发生了什么。2个脚本。一个将产生一艘飞船(一个立方体),另一个将使用推进器。当立方体快速下落时,稍微按住向上键以接合推进器
到2020年,这至少适用于Unity 5.6
#一,-
创建一个新的空白场景。确保您处于二维视图中不要更改任何内容。将此脚本添加到摄影机(它所做的只是生成一个对象):
使用系统集合;
使用UnityEngine;
公共类测试:单行为
{
私有void Start()
{
//创建一个新场景,将此脚本放在相机上。
start例程(spawnstestobject());
}
IEnumerator SpawnTestObject()
{
//繁殖对象
var go=GameObject.CreatePrimitive(PrimitiveType.Cube);
var col=go.GetComponent();
组件。销毁(col);
返回新的WaitForSeconds(.2f);
go.transform.position=新矢量3(0f,0f,-2f);
go.AddComponent();
go.AddComponent();
}
}
#二,-
将此脚本添加到项目文件夹中的某个位置(然后按play,查看游戏窗口):
使用UnityEngine;
公共类船舶检验:单一行为
{
//推力脚本组件
公共刚体2D刚体;
公共浮动推力量;//应用于unity中定义的推力量
专用浮点输入;//浮点变量,用于跟踪用户输入的“向上”箭头键/“向上”轴在操纵杆上的倾斜
void Start()
{
刚体=GetComponent();
推力量=10f;
}
无效更新()
{
PurchInput=Input.GetAxis(“垂直”);
}
void FixedUpdate()
{
如果(输入>0)
{
刚体.AddRelativeForce(transform.up*推力输入*推力量*2f,ForceMode2D.Force);
}
}
}
谢谢你的帮助
主要的错误是我们使用了Rigidbody2D
三维对象,而不仅仅是Rigidbody
。我们被一个事实弄糊涂了,那就是游戏是一个“二维”游戏,即使我们的资产是三维的
我们也从未想过使用rigidBody=GetComponent()
或使用参数ForceMode2D.Force
。这些都是很好的建议。很棒的测试脚本@Kale\u Surfer\u Dude 伙计,谢谢。我试着加大推力,但还是没有成功。我应该重新安装Unity吗?我不知道我还应该尝试什么。刚体2D身体类型:运动学材质:无(物理材质)模拟:真实使用完整运动学C…:错误碰撞检测:离散睡眠模式:开始-唤醒插值:无使用一些脚本更新我的答案,您可以使用这些脚本进行测试。Kale_Surfer_Dude谢谢!我发现了我的问题,有几件事我做错了,我会在回答中贴出来。
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>();
}
}
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);
}
}
}