使用unity制作一個(gè)寶可夢(mèng)——3.添加碰撞體

最后一點(diǎn)沒(méi)看懂,反正照著寫(xiě)了,貼個(gè)代碼
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//這是一個(gè)控制玩家的類(lèi),實(shí)現(xiàn)的功能有:
//1.上下左右移動(dòng)
//2.播放移動(dòng)動(dòng)畫(huà)
public class PlayerController : MonoBehaviour
{
??public float moveSpeed;?//玩家的移動(dòng)速度
??public LayerMask solidObjectsLayer;?//獲取房屋的圖層
??private bool isMoving;?//是否處在移動(dòng)
??private Animator animator;?//定義玩家的動(dòng)畫(huà)的狀態(tài)機(jī)
??private void Awake()?//Awake():生命周期函數(shù),當(dāng)組件被實(shí)例化并啟用時(shí),該方法將在其它方法之前調(diào)用一次
??{
????animator = GetComponent<Animator>();?//獲取到玩家的狀態(tài)機(jī)
??}
??private void Update()
??{
????if (!isMoving)
????{
??????var input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
?????
??????if (input.x != 0) input.y = 0;?//限制角色走斜線
??????if (input != Vector2.zero)?//如果輸入的值不為0
??????{
????????//將輸入的x,y值賦予給moveX,moveY,用來(lái)控制角色的動(dòng)畫(huà)狀態(tài)
????????animator.SetFloat("moveX",input.x);
????????animator.SetFloat("moveY", input.y);
????????var targetPos = transform.position;?//targetPos:目標(biāo)的位置
????????targetPos.x += input.x;?????//x方向加上垂直方向輸入進(jìn)來(lái)的值
????????targetPos.y += input.y;?????//y方向加上水平方向輸入進(jìn)來(lái)的值
????????if (isWalkable(targetPos))?//如果移動(dòng)沒(méi)有被阻塞
??????????StartCoroutine(Move(targetPos));?//開(kāi)啟玩家移動(dòng)的協(xié)程,將目標(biāo)的位置作為參數(shù)傳遞過(guò)去
??????}
????}
????animator.SetBool("isMoving",isMoving);?//將isMoving的狀態(tài)賦予給狀態(tài)機(jī)
??}
??IEnumerator Move(Vector3 targetPos)
??{
????isMoving = true;
????// 循環(huán)判斷當(dāng)前位置與目標(biāo)位置之間的距離是否大于一個(gè)很小的數(shù)值
????while ((targetPos - transform.position).sqrMagnitude > Mathf.Epsilon)
????{
??????// 計(jì)算每幀應(yīng)該移動(dòng)的距離,并讓物體朝目標(biāo)位置移動(dòng)一步
??????transform.position = Vector3.MoveTowards(transform.position, targetPos, moveSpeed * Time.deltaTime);
??????// 讓程序等待下一幀再執(zhí)行
??????yield return null;
????}
????// 直接將物體移動(dòng)到精確定位到目標(biāo)位置上,避免偏差堆積
????transform.position = targetPos;
????isMoving = false;
??}
??private bool isWalkable(Vector3 targetPos)?//判斷行走是否被阻塞
??{
????if (Physics2D.OverlapCircle(targetPos, 0.2f, solidObjectsLayer) != null)
????{
??????return false;
????}
????return true;
??}
}