行业知识
【UnityRPG游戏制作】NPC交互逻辑、动玩法
2026-10-28 03:17:17
来源:互联网转载
个人主页:@元宇宙-秩沅
hallo 欢迎 点赞 收藏⭐ 留言 加关注✅!
本文由 秩沅 原创
收录于专栏:就业宝典
⭐️推荐专栏⭐
⭐-软件设计师高频考点大全⭐
文章目录
- ⭐前言⭐
- (==二==) NPC逻辑相关
- (==1==) NPC范围检测
- (==2==) NPC动画添加
- (==3==) NPC和玩家的攻击受伤交互(事件中心)
- (==4==) NPC的受伤特效添加
- (==5==) NPC的***亡特效添加
- ⭐️⭐
⭐前言⭐
(二) NPC逻辑相关
(1) NPC范围检测
using System.Collections;using System.Collections.Generic;using UnityEngine;//-------------------------------//-------功能: NPC交互脚本//-------创建者: -------//------------------------------public class NPCContorller : MonoBehaviour{ public PlayerContorller playerCtrl; //范围检测 private void OnTriggerEnter(Collider other) { playerCtrl.isNearby = true; } private void OnTriggerExit(Collider other) { playerCtrl.isNearby = false; }}(2) NPC动画添加
(3) NPC和玩家的攻击受伤交互(事件中心)
- EnemyController 敌人
using DG.Tweening;using System.Collections;using System.Collections.Generic;using Unity.VisualScripting;using UnityEngine;using UnityEngine.UI;//-------------------------------//-------功能: 敌人控制器//-------创建者: -------//------------------------------public class EnemyController : MonoBehaviour{ public GameObject player; //对标玩家 public Animator animator; //对标动画机 public GameObject enemyNPC; //对标敌人 public int hp; //血量 public Image hpSlider; //血条 private int attack = 10; //敌人的攻击力 public float CD_skill ; //技能冷却时间 private void Start() { enemyNPC = transform.GetChild(0).gameObject; animator = enemyNPC.GetComponent(); SendEvent(); //发送相关事件 } private void Update() { CD_skill += Time.deltaTime; //CD一直在累加 } /// /// 发送事件 /// private void SendEvent() { //传递怪兽攻击事件(也是玩家受伤时) EventCenter.GetInstance().AddEventListener(PureNotification.PLAYER_INJURY, (int attack) => { animator.SetBool("attack",true ); //攻击动画激活 }); //传递怪兽受伤事件(玩家攻击时) EventCenter.GetInstance().AddEventListener(PureNotification.PLAYER_ATTRACK, ( ) => { animator.SetBool("hurt", true); //受伤动画激活 }); //传递怪兽***亡事件 EventCenter.GetInstance().AddEventListener(PureNotification.NPC_Died , () => { animator.SetBool("died", true); //***亡动画激活 gameObject.SetActive(false); //给物体失活 //暴金币 }); } //碰撞检测 private void OnCollisionStay(Collision collision) { if (collision.gameObject.tag == "Player") //检测到如果是玩家的标签 { if(CD_skill > 2f) //攻击动画的冷却时间 { Debug.Log("怪物即将攻击"); CD_skill = 0; //触发攻击事件 EventCenter.GetInstance().EventTrigger(PureNotification.PLAYER_INJURY, Attack()); } } } /// /// 传递攻击力 /// /// public int Attack() { return attack; } //碰撞检测 private void OnCollisionExit(Collision collision) { if (collision.gameObject.tag == "Player") //检测到如果是玩家的标签 { animator.SetBool("attack", false); collision.gameObject.GetComponent().animator .SetBool("hurt", false); } } //范围触发检测 private void OnTriggerStay(Collider other) { if(other.tag == "Player") //检测到如果是玩家的标签 { //让怪物看向玩家 transform.LookAt(other.gameObject.transform.position); //并且向其移动 transform.Translate(Vector3.forward * 1 * Time.deltaTime); } } }- PlayerContindex.php/tags-1038.html" >orller玩家
using System.Collections;using System.Collections.Generic;using Unity.VisualScripting;using UnityEngine;using UnityEngine.UIElements;using static UnityEditor.Experimental.GraphView.GraphView;//-------------------------------//-------功能: 玩家控制器//-------创建者: //------------------------------public class PlayerContorller : MonoBehaviour{ //----------------------------------------- //---------------成员变量区----------------- //----------------------------------------- public float speed = 1; //速度倍量 public Rigidbody rigidbody; //刚体组建的声明 public Animator animator; //动画控制器声明 public GameObject[] playersitem; //角色数组声明 public bool isNearby = false; //人物是否在附近 public float CD_skill ; //技能冷却时间 public int curWeaponNum; //拥有武器数 public int attack ; //攻击力 public int defence ; //防御力 //----------------------------------------- //----------------------------------------- void Start() { rigidbody = GetComponent(); SendEvent();//发送事件给事件中心 } void Update() { CD_skill += Time.deltaTime; //CD一直在累加 InputMonitoring(); } void FixedUpdate() { Move(); } /// /// 更换角色[数组] /// /// public void ChangePlayers(int value) { for (int i = 0; i = 1.0f) //按下空格键攻击,并且技能恢复冷却 { if (curWeaponNum > 0) //有武器时的技能相关 { animator.speed = 2; animator.SetTrigger("Attack2"); } else //没有武器时的技能相关 { animator.speed = 1; animator.SetTrigger("Attack1"); } CD_skill = 0; #region //技能开始冷却 // audioSource.clip = Resources.Load("music/01"); // audioSource.Play(); // cd_Put = 0; //var enemys = GameObject.FindGameObjectsWithTag("enemy"); //foreach (GameObject enemy in enemys) //{ // if (enemy != null) // { // if (Vector3.Distance(enemy.transform.position, this.transform.position) // enemy.transform.GetComponent // if (boss != null) // { // if (Vector3.Distance(boss.transform.position, this.transform.position) // boss.transform.GetComponent // changeWeapon = !changeWeapon; //} //if (Input.GetKeyDown(KeyCode.Q)) //{ // AddHP(); // diaPanel.USeHP(); //} //if (enemys != null && enemys.transform.childCount // key.gameObject.SetActive(true); //} } /// //传递玩家攻击事件 EventCenter.GetInstance().AddEventListener(PureNotification.PLAYER_ATTRACK, () = { }); //传递玩家受伤事件(怪物攻击时) EventCenter.GetInstance().AddEventListener(PureNotification.PLAYER_INJURY , (int attack) = { animator.SetBool("hurt", true); Debug.Log(attack + "掉血了"); }); }} //若碰到敌人,并进行攻击 if (collision.gameObject.tag == "enemy" && Input.GetKeyDown(KeyCode.Space)) { Debug.Log("造成伤害"); enemyController = collision.gameObject.GetComponent collision.transform.GetChild(0).GetComponent //若碰到敌人,并进行攻击 if (collision.gameObject.tag == "enemy" && Input.GetKeyDown(KeyCode.Space)) { Debug.Log("造成伤害"); enemyController = collision.gameObject.GetComponent collision.transform.GetChild(0).GetComponent
- PlayerContindex.php/tags-1038.html" >orller玩家
- EnemyController 敌人