文章目錄
- 前言
- 一、Navigation 智能導航地圖烘焙
- 1.創建Plan和NavMesh Surface
- 2.智能導航地圖烘焙
- 二、MouseManager 鼠標控制人物移動
- 1.給場景添加人物,并給人物添加導航組件
- 2.編寫腳本管理鼠標控制
- 3.給人物編寫腳本,訂閱事件(添加方法給MouseManager的OnMouseClick)
- 目前效果展示
- 三、添加人物移動動畫
- 1.制作運動動畫
- 2.將動畫機添加給人物
- 3.關聯人物速度給動畫
- 最終效果展示
前言
Uniyt版本:2022.3
實現內容:
1.點擊地圖,人物移動到點擊位置
2.給人物添加移動動畫
效果展示:
使用素材:
人物素材
-
導入人物素材:
Window->Package
-
22.3需要導入AI Navigation包
-
一、Navigation 智能導航地圖烘焙
1.創建Plan和NavMesh Surface
2.智能導航地圖烘焙
下面展示烘焙完的效果:
二、MouseManager 鼠標控制人物移動
1.給場景添加人物,并給人物添加導航組件
人物屬性欄Y軸改為0.5
添加導航組件:
2.編寫腳本管理鼠標控制
創建腳本:MouseManager
腳本為設計為單例模式,場景中只需要一個。
using System;
using UnityEngine;public class MouseManager : MonoBehaviour
{//靜態對象,其他腳本可以通過這個對象來調用當前類的方法public static MouseManager Instance;void Awake(){if(Instance!=null){Debug.LogError("存在多個對象,可能存在問題");Destroy(gameObject);}Instance = this;}//事件,我認為是方法集,其他腳本可以通過這個添加一個放過進來,此腳本會在合適時機執行里面的方法public event Action<Vector3> OnMouseClick;RaycastHit hitInfo;//射線碰撞的對象的信息結構體void Update(){MouseControl();}void MouseControl(){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//Input.GetMouseButtonDown(0)按下鼠標左擊返回為trueif (Input.GetMouseButtonDown(0)&&Physics.Raycast(ray, out hitInfo)){Debug.Log("鼠標被點擊了");//如果點擊地面就拿到點擊位置給方法集if(hitInfo.collider.gameObject.CompareTag("Ground")){Debug.Log(hitInfo.point);//?是表示如果方法集里不為空執行后面操作OnMouseClick?.Invoke(hitInfo.point);}}}}
創建空對象命名為MouseManager掛載腳本
3.給人物編寫腳本,訂閱事件(添加方法給MouseManager的OnMouseClick)
using UnityEngine;
using UnityEngine.AI;public class MouseController : MonoBehaviour
{NavMeshAgent agent;void Awake(){agent = GetComponent<NavMeshAgent>();}void Start(){//添加方法到放過方法集里-訂閱MouseManager.Instance.OnMouseClick += MoveToTarget;}//告訴agent目標位置public void MoveToTarget(Vector3 target){//設置這個變量,人物就會向目標方向移動agent.destination = target;}
}
添加腳本給人物:
目前效果展示
三、添加人物移動動畫
1.制作運動動畫
運動動畫有三種狀態:待機,走,跑
三種狀態可以通過速度來更改狀態動畫
- 創建Animator Controller命名為Player
雙擊進入動畫機界面,右鍵空白位置,創建混合樹
雙擊混合樹,添加Float變量命名為Speed:
修改混合樹參數,添加通過三種動畫到混合樹里
2.將動畫機添加給人物
3.關聯人物速度給動畫
通過腳本MouseContorller將速度給動畫機的Speed變量
using UnityEngine;
using UnityEngine.AI;public class MouseController : MonoBehaviour
{NavMeshAgent agent;Animator anim;void Awake(){agent = GetComponent<NavMeshAgent>();anim = GetComponent<Animator>();}void Start(){//添加方法到放過方法集里-訂閱MouseManager.Instance.OnMouseClick += MoveToTarget;}void Update(){anim.SetFloat("Speed", agent.velocity.sqrMagnitude);}//告訴agent目標位置public void MoveToTarget(Vector3 target){//設置這個變量,人物就會向目標方向移動agent.destination = target;}
}