我们打开上一篇21项目优化的项目,
本章要做的事情是在召唤坐骑后的指定距离内点击骑乘即可乘坐坐骑
首先进入坐骑熊的预制体空间,将主角模型拖拽至坐骑身上并删除所有组件及标签
将子物体Player拖拽至其子级,父类删掉
将其Player隐藏
创建坐骑的动画控制器MountBearAC
创建参数IsIdle
设直线
设置返回线
将新建动画控制器MountBearAC拖拽至坐骑熊对象的动画控制器框选上
对坐骑熊增加一个NavMeshAgent组件,并修改标签为Player
(这里标签设置为Player的原因是当主角骑乘后会激活坐起身上隐藏的主角模型并隐藏本身主角Player,所以该标签设置为Player)
创建一个脚本:RidingMountMoving.cs
编写脚本:
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.AI;
using UnityEngine.EventSystems;
public class RidingMountMoving : MonoBehaviour{
bool isInMount;
Vector3 mountPos;
Animator animator;
GameObject playerObj;
Transform mount;
NavMeshAgent agent;
Button callBtn;
CameraCtrl cameraCtrl;
void Start(){
isInMount = false;
animator = GetComponent<Animator>();
playerObj = GameObject.Find("PlayerNormal(Clone)").gameObject;
mount = GetComponent<Transform>();
agent = mount.GetComponent<NavMeshAgent>();
cameraCtrl = Camera.main.GetComponent<CameraCtrl>();
callBtn = GameObject.Find
("Canvas/MountUI/Image/RideBtn").GetComponent<Button>();
callBtn.onClick.AddListener(OnCallButton);
}
public void OnCallButton(){
if (isInMount){
animator.SetBool("IsIdle", true);
isInMount = false;
mountPos = transform.position;
playerObj.transform.position = mountPos + Vector3.right * 2f;
Camera.main.GetComponent<CameraCtrl>().player = playerObj.transform;
transform.Find("Armature/Root_M/Spine1_M/Player").gameObject.SetActive(false);
playerObj.transform.gameObject.SetActive(true);
agent.speed = 3.5f;
}
else{
if (Vector3.Distance(transform.position, playerObj.transform.position) < 5f){
isInMount = true;
GameObject.Find("PlayerNormal(Clone)").SetActive(false);
transform.Find("Armature/Root_M/Spine1_M/Player").gameObject.SetActive(true);
cameraCtrl.player = transform;
animator.SetBool("IsIdle", false);
agent.speed = 6.5f;
}
}
}
void FixedUpdate(){
// 检查代理是否到达了目的地
if (agent.pathStatus == NavMeshPathStatus.PathComplete &&
agent.remainingDistance <= agent.stoppingDistance){
// 到达目的地,停止跑步动画,播放停止动画
animator.SetBool("IsIdle", true);
}
}
void Update(){
if (EventSystem.current.IsPointerOverGameObject())
return;
if (Input.GetMouseButtonDown(0)){
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit)){
animator.SetBool("IsIdle", false);
agent.SetDestination(hit.point);
}
}
}
}
将脚本挂载至坐骑熊预制体上
优化:(让主角在骑乘坐骑时点击取消坐骑失效)
修改脚本:CallOrHideMount.cs
优化:(让主角在下坐骑时停止移动)
运行项目 - 点击召唤坐骑后骑乘效果
本篇做了前十篇文章的项目优化,接下来还需做以下内容:
1.可拖动UI窗口
2.怪物集目标点巡航功能
3.隐藏怪物的生成
4.怪物I攻击范围内的主动攻击
5.掉落坐骑蛋的获取
6.异步传送转换场景
7.主城的Npc对话功能
以及开放回合制、坐骑系统、宠物系统、背包系统、神炼系统、商城系统、Boss的目标跟随任务导航系统以及UI播放3D动画效果等等。
具体项目运行效果请关注water1024的b站视频项目演示《破碎纪元》