Unity中的人物控制

Unity中的输入事件有两种,一种是全局触发,在每一帧的更新时都要进行判断,另一种是监听式触发,监听某个触发条件从而执行之后的逻辑。全局输入适用于人物控制,移动等事件的使用。需要用到Input类,它可以监听键盘,鼠标,手柄,以及移动设备上的Touch事件。由于全局输入没有提供触发事件,需要在Update中通过每一帧的更新去判断是否执行。

1、Input类中的GetKey方法有三种:GetKey()、GetKeyDown()和GetKeyUp()。参数类型为KeyCode,例如Input.GetKey(KeyCode.W)

区别:GetKey会不断监听键盘操作并执行后续逻辑,GetKeyDown只监听按下按键的一次动作,GetKeyUp只监听按键松开的一次动作。

void Update () {
        if(Input.GetKeyUp(KeyCode.W))
        {
            modle.position += Vector3.forward + new Vector3(0f, 0f, 0.1f); 
        }
        if(Input.GetKey(KeyCode.D))
        {
            modle.position += Vector3.right + new Vector3(0.1f, 0, 0);
        }
        if (Input.GetKeyDown(KeyCode.S))
        {
            modle.position += Vector3.back + new Vector3(0, 0, 0.1f);
        }
        if (Input.GetKey(KeyCode.A))
        {
            modle.position += Vector3.left + new Vector3(0.1f, 0, 0);
        }

    }

2、Unity定义了一下中常用的组合键,这些键可以在Editor—>Project Setting—>Input中进行管理。

我们可以通过使用Input.GetAxis("组合键名")函数来获取事先设置的组合键的值。

private float h = 0.0f;
private float v = 0.0f;
void Update(){
    h = Input.GetAxis("Horizontal");
    v = Input.GetAxis("Vertical");    
}

例如:Input.GetAxis("Horizontal")函数,Horizontal的默认按键是A,D或Left,Right。该方法的返回值介于-1和1之间。

若对键盘控制时效性要求较高,可以使用Input.GetAxisRaw("Horizontal")函数,该函数仅返回-1、0、1三个值。

3、自定义Button类实现输入事件

定义一个MyButon类

public class MyButton{
    
    //定义按钮的三种状态
    public bool IsPressing = false;
    public bool OnPressed = false;
    public bool OnReleased = false;


    //用两个布尔值标记当前的按钮状态和上一次的状态
    private bool curState = false;
    private bool lastState = false;
    

    //声明一个方法处理按钮的点击事件
    public void Tick(bool input)
    {

        //Ispressing即为当前的input事件
        curState = input;
        IsPressing = curState;

        //其他状态值置为false
        OnPressed = false;
        OnReleased = false;
        
        

        //比较当前状态和上一次的状态
        if(curState!=lastState)
        { 
            if(curState == true)
            {
                //如果当前状态为按压,上一次状态为非按压,则此时按钮处于按压后的状态
                OnPressed = true;
            }
            else
            {
                OnReleased = true;               
            }

        }

        //这一轮的当前按钮状态为下一轮判断的前次状态
        lastState = curState;        
    }
}

MyButton类应该具备按钮的三种状态:IsPressing,OnPressed,OnReleased,声明一个Tick(bool input)函数,参数是一个表示按键是否按下的布尔值。当input=true时,表示按钮正在按下,即isPressing=true。而为了表达“刚刚按下”——OnPressed状态和“刚刚释放”——OnReleased状态,则需要引入两个状态值标记当前状态curState和前次状态lastState。前次状态和当前状态不相等时,表示按钮进行过按压或释放操作,当curState = true;lastState = false;时表示按钮进行过按压操作,当curState = false;lastState = true;则表示按钮进行过释放操作。本轮判断结束前,把curState值赋给lastState,进行下一轮的判断。

 

 

 

 

 

 

 

 

 

 

 

### 实现Unity 3D角色控制器 在Unity中实现3D角色控制涉及多个方面,包括物理模拟、输入处理以及动画管理。为了创建一个基本的角色控制系统,可以利用`MonoBehaviour`方法来初始化和更新游戏对象的行为[^1]。 #### 创建基础项目结构 首先,在Unity编辑器内新建一个场景,并导入所需的资源包(如标准资产中的Character Controller)。接着,创建一个新的C#脚本来定义玩家行为逻辑: ```csharp using UnityEngine; namespace Com.MyCompany.MyGame { public class CharacterController : MonoBehaviour { private Rigidbody rb; void Start() { rb = GetComponent<Rigidbody>(); } void FixedUpdate() { float moveHorizontal = Input.GetAxis("Horizontal"); float moveVertical = Input.GetAxis("Vertical"); Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical); rb.AddForce(movement * speed); // 假设speed是一个公共变量用于调整移动速度 } } } ``` 此代码片段展示了如何通过继承自`MonoBehaviour`类的方法来进行物体的初始化(`Start`)与固定时间间隔下的状态更新(`FixedUpdate`)。这里还涉及到获取用户的键盘输入并将其转换成作用于刚体上的力,从而驱动角色按照指定方向前进。 对于更复杂的功能需求,比如跳跃或是攀爬,则可能需要引入额外的状态机设计模式或者借助Mecanim系统完成动作间的平滑过渡。此外,考虑到不同平台间操作方式的区别,也应当适配手柄或其他外接设备的支持方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值