游戏制作之人物移动(二)
综述
上次我们主要进行讲解的是游戏开发过程遇到的一些问题,以及想法,主要讲述了如何使用键盘进行控制人物移动。主要是通过刚体和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<Vector3> onMouseClicked;//获取一个event事件
public event Action<GameObject> 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控制器,其中包括类型、速度、角速度、加速度,以及对于障碍物的躲避,可以跨越的障碍物的高度和范围等。
总结
通过本次分享,主要谈到了人物控制的剩余两种方式,用的虽然不如前面两种多,但是也在游戏中非常常见的。