C# Unity 3D中的水平射击角色控制器

C# Unity 3D中的水平射击角色控制器,c#,unity3d,C#,Unity3d,我正在创建一个水平侧滚动射击游戏,我计划在移动设备上发布。我如何设置船舶,以便: 它可以自由上/下/左/右移动(水平/垂直速度不同) 与障碍物碰撞并停止(即,如果与障碍物碰撞停止) 水平面上的对角线移动(向下+右输入)应向右移动,并压在地板上 船不能通过障碍物 我创建了一个自定义角色控制器,它可以根据速度简单地调整位置。我不知道如何检测碰撞并避免通过障碍物。必须有一种更简单的方法来实现这个简单的要求 注意:为了澄清,相机跟随船,它不会自动滚动。玩家可以通过释放输入按钮来停止飞船。首先,请尝试

我正在创建一个水平侧滚动射击游戏,我计划在移动设备上发布。我如何设置船舶,以便:

  • 它可以自由上/下/左/右移动(水平/垂直速度不同)
  • 与障碍物碰撞并停止(即,如果与障碍物碰撞停止)
  • 水平面上的对角线移动(向下+右输入)应向右移动,并压在地板上
船不能通过障碍物

我创建了一个自定义角色控制器,它可以根据速度简单地调整位置。我不知道如何检测碰撞并避免通过障碍物。必须有一种更简单的方法来实现这个简单的要求


注意:为了澄清,相机跟随船,它不会自动滚动。玩家可以通过释放输入按钮来停止飞船。

首先,请尝试确保已将组件添加到障碍物和角色控制器中。这应该足以阻止你的飞船通过障碍物。

首先,尝试确保你已经在障碍物和角色控制器中添加了一个组件。这应该足以阻止你的船通过障碍物。

我存储了自己的
速度
向量,然后使用
变换。转换
。这显然忽略了任何碰撞检测,并且需要自定义碰撞检测实现

相反,我发现
刚体
组件包含自己的
速度
变量。该速度值可以轻松更改,并且对象将自动平移并与障碍物碰撞。以下是一个例子:

using UnityEngine;
using System.Collections;

public class CharacterController : MonoBehaviour {

    public Vector2 maximumSpeed = new Vector2(1.0f, 1.0f);

    void Start() {

    }

    void Update() {
        Rigidbody rigidbody = GetComponent<Rigidbody>();

        Vector2 velocity = new Vector2();

        velocity.x = Input.GetAxis("Horizontal") * maximumSpeed.x;
        velocity.y = Input.GetAxis("Vertical") * maximumSpeed.y;

        rigidbody.velocity = velocity;
    }

}
使用UnityEngine;
使用系统集合;
公共类CharacterController:单行为{
公共矢量2最大速度=新矢量2(1.0f,1.0f);
void Start(){
}
无效更新(){
刚体刚体=GetComponent();
Vector2速度=新Vector2();
速度.x=输入.GetAxis(“水平”)*最大速度.x;
velocity.y=Input.GetAxis(“垂直”)*maximumSpeed.y;
刚体速度=速度;
}
}

这似乎很有效。请发表意见:-)

我正在存储自己的
速度
向量,然后使用
transform.Translate
应用该向量。这显然忽略了任何碰撞检测,并且需要自定义碰撞检测实现

相反,我发现
刚体
组件包含自己的
速度
变量。该速度值可以轻松更改,并且对象将自动平移并与障碍物碰撞。以下是一个例子:

using UnityEngine;
using System.Collections;

public class CharacterController : MonoBehaviour {

    public Vector2 maximumSpeed = new Vector2(1.0f, 1.0f);

    void Start() {

    }

    void Update() {
        Rigidbody rigidbody = GetComponent<Rigidbody>();

        Vector2 velocity = new Vector2();

        velocity.x = Input.GetAxis("Horizontal") * maximumSpeed.x;
        velocity.y = Input.GetAxis("Vertical") * maximumSpeed.y;

        rigidbody.velocity = velocity;
    }

}
使用UnityEngine;
使用系统集合;
公共类CharacterController:单行为{
公共矢量2最大速度=新矢量2(1.0f,1.0f);
void Start(){
}
无效更新(){
刚体刚体=GetComponent();
Vector2速度=新Vector2();
速度.x=输入.GetAxis(“水平”)*最大速度.x;
velocity.y=Input.GetAxis(“垂直”)*maximumSpeed.y;
刚体速度=速度;
}
}

这似乎很有效。欢迎评论:-)

飞船物体有一个球形对撞机。我不确定如何使对撞机工作。我的自定义控制器脚本只是使用velocity来转换对象。我不知道如何检测碰撞并取消移动。注意不要启用碰撞器的IsTrigger复选框。@Kay未勾选
IsTrigger
复选框。我的主要问题(我想)是我的角色控制器中没有碰撞检测逻辑。我不确定这将如何实现。@Kay我已经添加了“脊体”,现在它似乎正在碰撞。但一旦撞到地面,船就开始向上上升,而且没有停止。我有质量:1,阻力:0,角阻力:0.2,重力:否,运动学:否,插值:无,碰撞检测:离散,锁定X/Z旋转我现在找到了解决方案,请参见下文。谢谢你的帮助,你帮助我提高了我对它工作原理的理解。飞船物体有一个球形对撞机。我不确定如何使对撞机工作。我的自定义控制器脚本只是使用velocity来转换对象。我不知道如何检测碰撞并取消移动。注意不要启用碰撞器的IsTrigger复选框。@Kay未勾选
IsTrigger
复选框。我的主要问题(我想)是我的角色控制器中没有碰撞检测逻辑。我不确定这将如何实现。@Kay我已经添加了“脊体”,现在它似乎正在碰撞。但一旦撞到地面,船就开始向上上升,而且没有停止。我有质量:1,阻力:0,角阻力:0.2,重力:否,运动学:否,插值:无,碰撞检测:离散,锁定X/Z旋转我现在找到了解决方案,请参见下文。感谢您的帮助,您帮助我更好地理解了这一点。另一种可能更适合玩家控制实体的解决方案是使用
CharacterController
组件,该组件提供了类似的功能,但带有一些“松散”逻辑,以允许实体由玩家控制(与纯物理实体相反).不过,就你的速度/惯性而言,你可能最适合你现有的解决方案。@Dan Cheers我将对此进行试验。
CharacterController
是否可能表现更好?另一种可能更适合玩家控制实体的解决方案是使用
CharacterController
组件,该组件提供类似的功能,但具有一些“松散”逻辑,以允许实体由玩家控制(而不是纯物理实体)