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);
        }
    }
}