编写AIController脚本,用于AI的控制,攻击范围的主要逻辑为检测AI和玩家的距离,并设定一个追逐距离。
设定玩家的标签为player,玩家身上也需要挂载生命值脚本,修改Fighter脚本,把Attack方法和CanAttack的CombatTarget修改成Gameobject,这样就可以让AI也调用该脚本
还需将PlayerController报错的地方修改成gameobject。具体详情参考视频,代码供参考
AIController:
- using RPG.Combat;
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
-
- namespace RPG.Control
- {
- //AI的控制
- public class AIController : MonoBehaviour
- {
- [SerializeField] float chaseDistance = 5f;// 设定追逐范围的距离
-
- Fighter fighter;
- GameObject player;
-
- private void Start()
- {
- fighter = GetComponent<Fighter>();
- player = GameObject.FindWithTag("Player");// 找到标签为“Player”的游戏对象
- }
-
- private void Update()
- {
-
-
- // 如果和玩家的距离小于设定的追逐范围 并且可以攻击玩家
- if (InAttackRangeOfPlayer()&& fighter.CanAttack(player))
- {
- fighter.Attack(player);//对玩家进行攻击
- print("可以攻击");
- }
- else
- {
- fighter.Cancel();//取消攻击
- }
-
-
- }
-
- private bool InAttackRangeOfPlayer() // 检测是否在攻击范围内
- {
- float distanceToPlayer = Vector3.Distance(player.transform.position,transform.position); // 计算并返回玩家和当前对象之间的距离
- return distanceToPlayer < chaseDistance;//返回两者之间距离是否小于追逐距离
- }
-
-
- }
- }
-
复制代码
Fighter:
复制代码 PlayerController:
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using RPG.Movement;
- using RPG.Combat;
-
-
-
- //角色的控制
- namespace RPG.Control
- {
-
- public class PlayerController : MonoBehaviour
- {
- private Mover mover;
-
- private void Start()
- {
- mover = GetComponent<Mover>();
- }
-
- private void Update()
- {
- if (InteractWithCombat()) return;
- if (InteractWithMovement()) return;
-
- }
-
-
-
- private bool InteractWithCombat()// 战斗交互
- {
- RaycastHit[] hits = Physics.RaycastAll(GetMouseRay());
- foreach (RaycastHit hit in hits)
- {
- CombatTarget target = hit.transform.GetComponent<CombatTarget>();//被射线击中的物体获取战斗目标组件
- if(target == null) continue;//如果目标为空,继续执行
-
- if (!GetComponent<Fighter>().CanAttack(target.gameObject))//如果可以攻击该目标,继续执行
- {
- continue;
- }
-
- if(Input.GetMouseButtonDown(0))//按下左键
- {
- GetComponent<Fighter>().Attack(target.gameObject);//攻击目标
-
- }
- return true;//射线找到目标
- }
- return false;//射线没有找到目标 ActionScheduler
- }
-
- // 移动和交互
- private bool InteractWithMovement()
- {
- RaycastHit hit;//存储射线碰撞的信息
- bool hasHit = Physics.Raycast(GetMouseRay(), out hit); //通过射线检测是否有接触到碰撞物体
- if (hasHit)//如果有检测到
- {
- if (Input.GetMouseButton(0))//如果按下鼠标左键
- {
- mover.StartMoveAction(hit.point);
-
- }
- return true;
- }
- return false;
- }
-
-
-
- //创建射线
- private static Ray GetMouseRay()
- {
- return Camera.main.ScreenPointToRay(Input.mousePosition);
-
- }
- }
- }
-
复制代码
|