【UnityRPG游戏制作】NPC交互逻辑、动玩法

news/2024/5/18 16:16:41

在这里插入图片描述


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 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<Animator>();SendEvent();  //发送相关事件}private void Update(){CD_skill += Time.deltaTime; //CD一直在累加}/// <summary>/// 发送事件/// </summary>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());}    }}/// <summary>/// 传递攻击力/// </summary>/// <returns></returns>public  int  Attack(){return attack;}//碰撞检测private void OnCollisionExit(Collision collision){if (collision.gameObject.tag == "Player") //检测到如果是玩家的标签{animator.SetBool("attack", false);       collision.gameObject.GetComponent<PlayerContorller>().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);}}}
  • PlayerContorller玩家
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<Rigidbody>();SendEvent();//发送事件给事件中心}void Update(){CD_skill += Time.deltaTime;       //CD一直在累加InputMonitoring();}void FixedUpdate(){Move();}/// <summary>/// 更换角色[数组]/// </summary>/// <param name="value"></param>public void ChangePlayers(int value){for (int i = 0; i < playersitem.Length; i++){if (i == value){animator = playersitem[i].GetComponent<Animator>();playersitem[i].SetActive(true);}else{playersitem[i].SetActive(false);}}}/// <summary>///玩家移动相关/// </summary>private void Move(){//速度大小float horizontal = Input.GetAxis("Horizontal");float vertical = Input.GetAxis("Vertical");if (Input.GetAxis("Vertical") != 0 || Input.GetAxis("Horizontal") != 0){//方向Vector3 dirction = new Vector3(horizontal, 0, vertical);//让角色的看向与移动方向保持一致transform.rotation = Quaternion.LookRotation(dirction);rigidbody.MovePosition(transform.position + dirction * speed * Time.deltaTime);animator.SetBool("walk", true);//加速奔跑if (Input.GetKey(KeyCode.LeftShift) ){animator.SetBool("run", true);animator.SetBool("walk", true);                rigidbody.MovePosition(transform.position + dirction * speed*3 * Time.deltaTime);}else {animator.SetBool("run", false);;animator.SetBool("walk", true);}            }else {animator.SetBool("walk", false);}}/// <summary>/// 键盘监听相关/// </summary>public void InputMonitoring(){//人物角色切换if (Input.GetKeyDown(KeyCode.Alpha1)){ChangePlayers(0);}if (Input.GetKeyDown(KeyCode.Alpha2)){ChangePlayers(1);}if (Input.GetKeyDown(KeyCode.Alpha3)){ChangePlayers(2);}//范围检测弹出和NPC的对话框if (isNearby && Input.GetKeyDown(KeyCode.F)){          //发送通知打开面板GameFacade.Instance.SendNotification(PureNotification.SHOW_PANEL, "NPCTipPanel");}//打开背包面板if ( Input.GetKeyDown(KeyCode.Tab)){//发送通知打开面板GameFacade.Instance.SendNotification(PureNotification.SHOW_PANEL, "BackpackPanel");}//打开角色面板if ( Input.GetKeyDown(KeyCode.C)){//发送通知打开面板GameFacade.Instance.SendNotification(PureNotification.SHOW_PANEL, "RolePanel");}//攻击监听if (Input.GetKeyDown(KeyCode.Space) && CD_skill >= 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<AudioClip>("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) <= 5)//        {//            enemy.transform.GetComponent<_03EnemyCtrl>().SubSelf(50);//        }//    }//}//var bosses = GameObject.FindGameObjectsWithTag("boss");//foreach (GameObject boss in bosses)//{//    if (boss != null)//    {//        if (Vector3.Distance(boss.transform.position, this.transform.position) <= 5)//        {//            boss.transform.GetComponent<boss>().SubHP();//        }//    }//}#endregion}//if (Input.GetKeyDown(KeyCode.E))//{//    changeWeapon = !changeWeapon;//}//if (Input.GetKeyDown(KeyCode.Q))//{//    AddHP();//    diaPanel.USeHP();//}//if (enemys != null && enemys.transform.childCount <= 0 && key != null)//{//    key.gameObject.SetActive(true);//}}/// <summary>/// 发送事件/// </summary>private void SendEvent(){//传递玩家攻击事件EventCenter.GetInstance().AddEventListener(PureNotification.PLAYER_ATTRACK, () =>{});//传递玩家受伤事件(怪物攻击时)EventCenter.GetInstance().AddEventListener(PureNotification.PLAYER_INJURY , (int attack) =>{animator.SetBool("hurt", true);Debug.Log(attack + "掉血了");                                 });   }
}

4 NPC的受伤特效添加


请添加图片描述

    /// <summary>/// 碰撞检测/// </summary>/// <param name="collision"></param>private void OnCollisionStay(Collision collision){//若碰到敌人,并进行攻击if (collision.gameObject.tag == "enemy" && Input.GetKeyDown(KeyCode.Space)){Debug.Log("造成伤害");enemyController = collision.gameObject.GetComponent<EnemyController>();//触发攻击事件enemyController.animator.SetBool("hurt", true);  //怪物受伤动画激活enemyController.transform.GetChild(2).GetChild(0).GetComponent<ParticleSystem>().Play();enemyController.hp -= attack;//减少血量enemyController. hpSlider.fillAmount = (enemyController.hp / 100.0f);if (enemyController.hp <= 0) //死亡判断{collision.transform.GetChild(0).GetComponent<Animator>() .SetBool("died", true);  //死亡动画激活//播放动画collision.transform.GetChild(2).GetChild(0).GetComponent<ParticleSystem>().Play();collision. gameObject.SetActive(false); //将敌人失活//暴钻石(实例化)Instantiate(Resources.Load<GameObject>("Perfab/Prop/damon"), collision.transform.position , Quaternion.identity);Destroy(collision.gameObject, 3);}}}

5 NPC的死亡特效添加


请添加图片描述

   /// <summary>/// 碰撞检测/// </summary>/// <param name="collision"></param>private void OnCollisionStay(Collision collision){//若碰到敌人,并进行攻击if (collision.gameObject.tag == "enemy" && Input.GetKeyDown(KeyCode.Space)){Debug.Log("造成伤害");enemyController = collision.gameObject.GetComponent<EnemyController>();//触发攻击事件enemyController.animator.SetBool("hurt", true);  //怪物受伤动画激活enemyController.transform.GetChild(2).GetChild(0).GetComponent<ParticleSystem>().Play();enemyController.hp -= attack;//减少血量enemyController. hpSlider.fillAmount = (enemyController.hp / 100.0f);if (enemyController.hp <= 0) //死亡判断{collision.transform.GetChild(0).GetComponent<Animator>() .SetBool("died", true);  //死亡动画激活//播放动画collision.transform.GetChild(2).GetChild(0).GetComponent<ParticleSystem>().Play();collision. gameObject.SetActive(false); //将敌人失活//暴钻石(实例化)Instantiate(Resources.Load<GameObject>("Perfab/Prop/damon"), collision.transform.position , Quaternion.identity);Destroy(collision.gameObject, 3);}}}

🅰️


⭐【Unityc#专题篇】之c#进阶篇】

⭐【Unityc#专题篇】之c#核心篇】

⭐【Unityc#专题篇】之c#基础篇】

⭐【Unity-c#专题篇】之c#入门篇】

【Unityc#专题篇】—进阶章题单实践练习

⭐【Unityc#专题篇】—基础章题单实践练习

【Unityc#专题篇】—核心章题单实践练习


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!


在这里插入图片描述



http://www.mrgr.cn/p/21744265

相关文章

CSS JS Effect – 用 wheel 模拟 scroll

前言 在 用 JavaScript 实现 position sticky 文章中,我提到了用 wheel 来模拟 scroll 效果。 这篇来说说具体怎么实现,挺简单的哦。Preparation table.html<div class="container"><table><thead><tr><th>First Name</th><…

win11 Terminal 部分窗口美化

需求及分析&#xff1a;因为在 cmd、anaconda prompt 窗口中输入命令较多&#xff0c;而命令输入行和输出结果都是同一个颜色&#xff0c;不易阅读&#xff0c;故将需求定性为「美化窗口」。 美化结束后&#xff0c;我在想是否能不安装任何软件&#xff0c;简单地通过调整主题颜…

docker简单笔记

这里不说基础概念的东西,直接上车出发指令docker-compose --helpdocker-compose up 会自动下载运行依赖,然后跑到容器隔离环境中 docker-compose down --rmi all 删除由Docker Compose管理的所有容器安装 (我的版本20.10.5) 简单例子 如果遇到问题可以去终端检查 …

Linux课程机房虚拟机

Linux课程机房虚拟机 机房虚拟机(默认不能联网的): 百度网盘:https://pan.baidu.com/s/1WqSvqB3Y7b_D4690CDBlJA?pwd=augc 123网盘:https://www.123pan.com/s/tQ0UVv-LiolA.html提取码:F4xm ‍ 联网使用说明: 虚拟机 -> 设置 -> 网络适配器 -> 已连接 -> 重…

生日快乐

今天5月4. 五四运动什么的也不用我讲点什么了,估计咱谁也不比谁知道的多多少 讲点别的. 今天是爱丽丝的生日(1852.5.4) 经过数月的努力终于从贴吧上得知了爱丽丝的生日 没想到就在今天 真有缘分啊( 这个爱丽丝是真实存在的人物 《爱丽丝梦游仙境》就是以她为原型的 放张图(萝…

MLP实现fashion_mnist数据集分类(2)-函数式API构建模型(tensorflow)

使用函数式API构建模型&#xff0c;使得模型可以处理多输入多输出。 1、查看tensorflow版本 import tensorflow as tfprint(Tensorflow Version:{}.format(tf.__version__)) print(tf.config.list_physical_devices())2、fashion_mnist数据集分类模型 2.1 使用Sequential构建…

获取正确微软ISO镜像的方法

简介 如何找到正确的微软ISO镜像?这是很多新手遇到的问题,到处搜索找不到关键词,下载了很多夹带木马病毒的。 我就介绍一下我获取正确微软ISO镜像的方法。 KMS激活 相信大部分人都是要找能够KMS激活的版本,什么换序列号之类的操作就算了。 CN_WIN、SW_DVD9、SW_DVD5三种开…

python项目==一个web项目,配置模板指定文件清洗规则,调用模板规则清洗文件

代码地址 一个小工具。 一个web项目&#xff0c;配置模板指定文件清洗规则&#xff0c;调用模板规则清洗文件 https://github.com/hebian1994/csv-transfer-all 技术栈&#xff1a; SQLite python flask vue3 elementplus 功能介绍&#xff1a; A WEB tool for cleaning…

每日一题(力扣740):删除并获得点数--dp+思维

其实跟打家劫舍没啥区别 排序去重之后去考虑当前位置和前两个位置之间的关系即可&#xff0c;具体见代码&#xff1a; class Solution { public:int deleteAndEarn(vector<int>& nums) {int n nums.size();if (n 1) return nums[0];unordered_map<int, int>…

mysql 锁,和加锁机制

背景间隙锁是MySQL在RR可重复读隔离级别下用来修复幻读才引入的一种锁,间隙锁也只有在RR可重复读隔离级别下才会存在,如果是在RC读已提交隔离级别下,是没有间隙锁的存在的。另外,我们也知道,幻读这种现象也只有在当前读的时候才会发生,在一致性快照读的情况下是没有幻读现…

LLM 构建Data Multi-Agents 赋能数据分析平台的实践之③:数据分析之二(大小模型协同)

一、概述 随着新一代信息技术在产业数字化中的应用&#xff0c;产生了大量多源多模态信息以及响应的信息处理模式&#xff0c;数据孤岛、模型林立的问题也随之产生&#xff0c;使得业务系统臃肿、信息处理和决策效率低下&#xff0c;面对复杂任务及应用场景问题求解效率低。针…

MongoDB的安装(Linux环境)

登录到Linux服务器执行 lsb_release -a &#xff0c;即可得知服务器的版本信息为&#xff1a;CentOS 7。 # CentOS安装lsb_release包 [rootlinux100 ~]# sudo yum install redhat-lsb# 查看Linux版本 [rootlinux100 ~]# lsb_release -a LSB Version: :core-4.1-amd64:core-…

二分图染色

二分图bool dfs(int u, int c) {if (color[u] == c) return true;else if (color[u] == 3 - c) return false;color[u] = c;for (int v : graph[u])if (!dfs(v, 3 - c)) return false;return true; }习题:P1330 封锁阳光大学解题思路 按照题目要求,每一条边所连接的点中,至少…

Luminar开始为沃尔沃生产下一代激光雷达传感器

在自动驾驶技术的浪潮中&#xff0c;激光雷达&#xff08;LiDAR&#xff09;传感器以其高精度和强大的环境感知能力&#xff0c;逐渐成为了该领域的技术之星。Luminar&#xff08;路安达&#xff09;公司作为自动驾驶技术的领军企业&#xff0c;近日宣布已开始为沃尔沃汽车生产…

设计模式-01 设计模式单例模式

设计模式-01 设计模式单例模式 目录 设计模式-01 设计模式单例模式 1定义 2.内涵 3.使用示例 4.具体代码使用实践 5.注意事项 6.最佳实践 7.总结 1 定义 单例模式是一种设计模式&#xff0c;它确保一个类只能被实例化一次。它通过在类内部创建类的唯一实例并提供一个全…

算法随笔——manacher

非常好学习资料 manacher 求最长回文子串 暴力 枚举回文中心 \([1,n]\),暴力向两边拓展,然后 \(checkmax\)。时间复杂度 \(O(n^2)\) 可以用二分哈希优化至 \(O(n \log n)\) 算法思路 当求解第 \(i\) 个字符为回文中心的时候,已经知道了 \([1,i-1]\) 之间的信息。 于是引入 \…

在家连学校的服务器

在家连接学校的服务器。 Step1: 首先下载一个vscode的插件 Visual Studio Code - Code Editing. Redefined 我的服务区是ubuntu20.04&#xff0c;x64的&#xff0c;所以下载这个。 Step2: 下载到本地之后&#xff0c;想办法将这个文件拷贝到你的服务器上。 Step3: 解压该包…

MYSQL从入门到精通(二)

1、MYSQL高级概述 【1】架构概述 【2】索引优化 【3】查询截取 【4】mysql锁机制 【5】主从复制 2、MYSQL概述 【1】mysql内核 【2】sql优化工程师 【3】mysql服务器的优化 【4】各种参数常量设定 【5】查询语句优化 【6】主从复制 【7】软硬件升级 【8】容灾百分 【9】sql编…

易优CMS安装出现程序和数据库版本不一致情况的解决方法

易优cms建站系统出现无法安装,数据库文件版本号(V1.5.4)与CMS源码版本号(V1.5.6)不一致怎么办?这样的情况是因为程序在安装的时候是低版本,安装过通过后台升级到了最新版本。然后再进行数据库和程序的备份,就会导致程序和数据库版本不一致的情况。接下来我们给大家说下怎么…

Centos7+Hadoop3.3.4+KDC1.15+Ranger2.4.0集成

一、集群规划 本次测试采用3台虚拟机&#xff0c;操作系统版本为centos7.6。 kerberos采用默认YUM源安装&#xff0c;版本为&#xff1a;1.15.1-55 Ranger版本为2.4.0 系统用户为ranger:ranger IP地址主机名KDCRanger192.168.121.101node101.cc.localKDC masterRanger Admin…