角色漫游交互控制
现在小伙伴们空闲的时候,都会选择打打游戏来消遣一下,而现在的游戏就属3D游戏最受欢迎。在3D游戏中,我们通常都是控制一个角色模型在游戏世界中进行虚拟体验,那关于角色的移动交互控制,在我们Unity游戏开发中都是怎么实现的呢?
说到主角移动交互控制(针对于PC端),不同的游戏类型有不同的实现方案,最常见的交互控制方式:鼠标交互控制、键盘交互控制、鼠标键盘协同控制。今天咱们优就业小优为大家来分享的是采用鼠标的交互控制。
在RPG等游戏中,角色的移动交互控制就是采用的鼠标控制来实现的。有两种方式:鼠标左键自动寻路、鼠标右键实时控制。
1、鼠标左键自动寻路自动寻路在游戏中是一个很常用的一个功能,也是非常重要的一个功能。在中大型游戏中自动寻路通常通过A*寻路算法来实现,而小型游戏我们可以采用Unity自带的Navigation导航自动寻路。
这里我们也是采用第二种方式:Navigation自动寻路导航。下面我们一起来学习下实现步骤:
1)为地图烘焙自动寻路网格
我们选用官方案例《秘密行动》的案例资源;
首先将env_stealth_static.fbx拖拽到场景中并添加网格碰撞器组件;然后将障碍物跟地图场景模型设置Static:true;最后烘焙生成寻路网格数据。效果如下:
2)为角色模型创建状态机
将角色模型char_ethan.fbx拖拽到场景中,然后在Project中创建一个动画控制器char_ethan.controller,并创建一个融合树控制角色的站立跟跑步两种行为。
3)创建脚本PlayerController.cs,并编写交互行为控制
using UnityEngine;
using UnityEngine.AI;
public class PlayerController : MonoBehaviour
{
private Animator anim;
private NavMeshAgent agent;
private Ray ray;
private RaycastHit hit;
void Start()
{
anim = GetComponent<Animator>();
agent = GetComponent<NavMeshAgent>();
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
//从鼠标指针出发出一条射线
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit))
{
//如果射线碰撞到了地面
if (hit.collider.gameObject.layer == LayerMask.NameToLayer("Ground"))
{
agent.SetDestination(hit.point);
}
}
}
//当剩余距离与停止距离的差值大于0.1米是播放跑步动画,否则播放站立动画
if (agent.remainingDistance - agent.stoppingDistance > 0.1f)
{
anim.SetFloat("Speed", 1);
}
else
{
anim.SetFloat("Speed", 0);
}
}
}
4)参数配置
①为地面添加网格碰撞组件,并设置其Layer为Ground;
②角色Tag设置为Player,相机身上添加CameraMovement.cs跟随角色运动;
③角色身上的Animator组件去掉Apply Root Motion勾选,添加NavMeshAgent、PlayController组件;
5)播放运行,查看控制效果
2、鼠标右键实时控制
通过上述方式,我们学习了鼠标左键自动寻路功能的实现过程。但是在实际游戏中我们通常有走位控制,这个就需要我们采用鼠标右键实时控制行为了。
接下来我们一起在上面的PlayController.cs脚本中添简单修改一下代码实现这个行为控制。
if (Input.GetMouseButtonDown(0) || Input.GetMouseButton(1))
{
//里面代码不变
}
3、总结
关于《角色漫游交互控制》今天暂时为大家分享到这里,有对游戏开发感兴趣的或者想要找一份高薪职业的小伙伴都可以跟可以关注我哦~