游戏制作之人物移动(二)
- 综述
- 主体
- 内容2:人物移动控制方式--鼠标控制
- 总结
综述
上次我们主要进行讲解的是游戏开发过程遇到的一些问题,以及想法,主要讲述了如何使用键盘进行控制人物移动。主要是通过刚体和transfrom进行控制。
本次主要讲述关于人物移动的另一种方式。
主体
内容1
该方式是通过从网上进行查询总结的一个方式,也是通过键盘进行控制的一种,主要是通过角色控制器,控制角色移动,用于控制第一人称或第三人称角色的运动,也可以用于角色控制,比如限制角色爬坡的最大斜度,步伐的高度等,这个相当于组件Nav,通常用于AI人机。
horizontal = Input.GetAxis("Horizontal");vertical = Input.GetAxis("Vertical");//不考虑重力作用//characterController.Move(new Vector3(horizontal,0,vertical) * Time.deltaTime *moveSpeed);
上述主要通过一个控制器来实现人物移动,具体可以实验一下效果,因为项目中未涉及,所以不在测试。
内容2:人物移动控制方式–鼠标控制
本次我们讲解鼠标控制,该控制主要用于第四个游戏的角色移动控制。
如果实现鼠标控制呢?
我们主要来考虑两个方面内容,第一,如何确定鼠标点击的点,第二,
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//主要通过一个射线来实现位置的确定,而人物的走动主要是通过nav自动寻路来完成的。需要设置人物的行走,可以行走的最大坡度以及可以迈出的最大高度。if (Physics.Raycast(ray,out hitInfo)){//切换鼠标贴图,根据不同的触碰类型点击出现不同的指针贴纸switch (hitInfo.collider.gameObject.tag){case "Ground"://设置移动的指针类型Cursor.SetCursor(target, new Vector2(16, 16), CursorMode.Auto);break;case "Enemy"://设置移动的指针类型Cursor.SetCursor(attack, new Vector2(16, 16), CursorMode.Auto);break;}}transform.LookAt(target.transform);//转向移动目标
鼠标控制
public event Action onMouseClicked;//获取一个event事件public event Action onEnemyClicked;//点击物体的事件
//鼠标控制void MouseControll(){if(Input.GetMouseButtonDown(0) && hitInfo.collider != null)//按下了鼠标左键,并且射线有碰撞焦点{if (hitInfo.collider.gameObject.CompareTag("Ground")){onMouseClicked?.Invoke(hitInfo.point);}if (hitInfo.collider.gameObject.CompareTag("Enemy")){onEnemyClicked?.Invoke(hitInfo.collider.gameObject);}}}
给鼠标添加方法
MouseManager.Instance.onMouseClicked += MoveToTarget;//添加订阅的方法MouseManager.Instance.onEnemyClicked += EventAttack;//添加攻击的方法
moveToTarget方法
public void MoveToTarget(Vector3 target)//参数保存一致{StopAllCoroutines();//打断移向目标agent.isStopped = false; //重新设置可以移动agent.destination = target;//将 位置定位到这里}
对于攻击的方法,这里不涉及,咱就不说了。

上面是这个角色的nav控制器,其中包括类型、速度、角速度、加速度,以及对于障碍物的躲避,可以跨越的障碍物的高度和范围等。
总结
通过本次分享,主要谈到了人物控制的剩余两种方式,用的虽然不如前面两种多,但是也在游戏中非常常见的。