1.NPC定义

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SkillBridge.Message;namespace Common.Data
{public  enum NpcType //NPC定义 是功能性的 还是任务性的{None = 0,Function,Task}public enum NpcFunction //点击NPC会触发的功能事件{None = 0,InvokeShop,InvokeInsrance}public class NpcDefine{public int ID { get; set; }public string Name { get; set; }public NpcType Type { get; set; }public string Description { get; set; }//基本属性public NpcFunction Function { get; set; }public int Integer { get; set; }}
}

2.NPC管理器

实现管理NPC交互功能

using Common.Data;
using System.Collections.Generic;namespace Managers
{class NpcManager:Singleton<NpcManager>{public delegate bool NpcActionHandler(NpcDefine npc);Dictionary<NpcFunction, NpcActionHandler> eventMap = new Dictionary<NpcFunction, NpcActionHandler>();public NpcDefine GetNpcDefine(int npcID){return DataManager.Instance.Npcs[npcID];}public void RegisterNpcEvent(NpcFunction function,NpcActionHandler action){if (!eventMap.ContainsKey(function)){eventMap[function] = action;}elseeventMap[function] += action;}public bool Interactive(int npcID){if (DataManager.Instance.Npcs.ContainsKey(npcID)){NpcDefine npc = DataManager.Instance.Npcs[npcID];return Interactive(npc);}return false;}public bool Interactive(NpcDefine npc){if (npc.Type == NpcType.Task){return DoTaskInteractive(npc);}else if (npc.Type == NpcType.Function){return DoFunctionInteractive(npc);}return false;}private bool DoTaskInteractive(NpcDefine npc){if(npc.Type!= NpcType.Task){return false;}if (!eventMap.ContainsKey(npc.Task)){return false;}return eventMap[npc.Task](npc);//执行方法管理器中代码所注册的事件函数}private bool DoFunctionInteractive(NpcDefine npc){if(npc.Type!= NpcType.Function){return false;}if (!eventMap.ContainsKey(npc.Function)){return false;}return eventMap[npc.Function](npc);}}
}

3.NPC控制器

主要控制NPC的行为,比如待机行为,与玩家交互时转向行为,并处理一些交互任务,触碰NPC产生的效果等

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Common.Data;
using Managers;
using Models;public class NpcController : MonoBehaviour
{public int npcID;Animator anim;NpcDefine npc;Color originColor;private bool inInteractive = false;SkinnedMeshRenderer render;void Start(){anim = this.gameObject.GetComponentInChildren<Animator>();npc = NpcManager.Instance.GetNpcDefine(npcID);render = this.gameObject.GetComponentInChildren<SkinnedMeshRenderer>();originColor = render.sharedMaterial.color;npc = NpcManager.Instance.GetNpcDefine(this.npcID);this.StartCoroutine(Actions());}IEnumerator Actions(){while (true){if (inInteractive)yield return new WaitForSeconds(2f);elseyield return new WaitForSeconds(Random.Range(5f,10f));this.Relatex();}}private void Relatex(){anim.SetTrigger("Relax");}void Interactive(){if (this.inInteractive){this.inInteractive = true;StartCoroutine(DoInteractive());}}IEnumerator DoInteractive(){yield return FaceToPlayer();if (NpcManager.Instance.Interactive(npc)){anim.SetTrigger("Talk");}yield return new WaitForSeconds(3f);this.inInteractive = false;}IEnumerator FaceToPlayer(){Vector3 faceTo = (User.Instance.CurrentCharacterObj.transform.position - this.transform.position).normalized;while (Mathf.Abs(Vector3.Angle(this.gameObject.transform.forward, faceTo)) > 5){this.gameObject.transform.forward = Vector3.Lerp(this.gameObject.transform.forward, faceTo, Time.deltaTime * 5f);yield return null;}}// Update is called once per framevoid OnMouseDown(){this.Interactive();}private void OnMouseOver(){Highlight(true);}private void OnMouseEnter(){Highlight(true);}private void OnMouseExit(){Highlight(false);}private void Highlight(bool show){if (show){if (render.sharedMaterial.color != Color.white){render.sharedMaterial.color = Color.white;}}else{if (render.sharedMaterial.color != originColor){render.sharedMaterial.color = originColor;}}}
}

4.事件方法管理器

namespace FuncManager{class FuncManager:Singleton<FuncManager>{public void Init(){NpcManager.Instance.RegisterNpcEvent(NpcFunction.InvokeShop,OnNpcInvodeShop);}
private bool OnNpcInvodeShop(NpcDefine npc){//根据NPC的类型 打开不同的商店UI
//比如 发布任务的 打开的是任务商店 普通商人 打开是道具商店等等
return true;
}
}

RPG游戏-NPC系统相关推荐

  1. RPG 游戏数值系统—1

    今天讲一下做RPG游戏一个插件-RPGStatCollection,RPG游戏最主要的就是我们所谓的一些数值,就像英雄联盟一样,你选择每个角色的时候如果不带天赋和符文进去,每个角色都是存在基本的数值的 ...

  2. RPG 游戏数值系统—2

    接着前面所讲的RPG数值系统,前面讲到怎么添加一些基本属性然后怎么通过可视化的方法给每个人物进行配置他们所有属性,接下来就是怎么知道我的属性它的值是多少,例如当角色进入攻击状态的时候我们需要知道角色的 ...

  3. [转载]Unity的RPG游戏装备系统的实现

    原作者和链接: RPG游戏<黑暗之光>流程介绍与代码分析之(八):装备系统的实现 - s1314_JHC的博客 - CSDN博客 https://blog.csdn.net/s1314_J ...

  4. RPG游戏-道具系统

    (一)服务器端 在数据库结构中,一个角色对应多个道具物品. (1)道具类 1.道具定义: using SkillBridge.Message; using System; using System.C ...

  5. RPG游戏-小地图系统

    1.地图资源的制作 通常有三种方式: 1)实时渲染场景: 2)预渲染顶视图+润色 3)纯美术制作 这里采用第二种方式 (1)使用图片MASK方式设置小地图的蒙层,这里的Mask图片采用的是圆形的白色图 ...

  6. RPG游戏-小地图系统(二)

    这里对上次的代码做优化,当进入或者地图时,小地图UI也应该进行变化. 调用次序:MapController->MiniMapManager -->UIminiMap 1.MapContro ...

  7. RPG游戏-刷怪系统

    一.数据定义 (一).刷怪规则定义: namespace Common.Data {public class SpawnRuleDefine{public int ID { get; set; }pu ...

  8. 浅谈RPG游戏中的属性系统设定

    先来张我最喜欢的Nero和Dante的帅照!!! 最近的E3展也是让广大游戏爱好者们打开眼界,小编最喜欢的鬼泣系列也将于明年春季迎来鬼泣4的正统续作鬼泣5,再加上最近小编也在自己开发着RPG游戏,所以 ...

  9. Silverlight 2.5D RPG游戏技巧与特“.NET技术”效处理:(十一)AI系统

    谈到人工智能(AI),这个话题就太大了:大学里有<人工智能教程>专门讲这方面的知识,什么大名鼎鼎的人工神经网络.遗传算法等等均可一窥究竟,这里如赘述似乎有些班门弄斧,我们暂且丢它一边去吧. ...

  10. RPG游戏经典的系统架构

    RPG游戏经典的系统架构设计 : bigword 游戏引擎就是使用这种架构,我认识的很多rpg游戏公司的同事也大致采用了这种架构方式. loginapp : 登陆服务器,主要负责player 的登陆请 ...

最新文章

  1. 1291 火车线路(区间修改,区间最值)
  2. 【转】使用Core Graphics绘画一个山寨微信icon
  3. linux 内核驱动编程 简单例子 与_IO, _IOR, _IOW, _IOWR 宏解析
  4. 关于SpringAOP的XML方式的配置
  5. Jenkins实现Android自动化打包
  6. 恢复联想键盘F1-F12标准模式
  7. SAP CRM IBASE头部字段valid from和valid to的填充逻辑
  8. oracle数据库中VARCHAR2(50 CHAR) 和VARCHAR2(50) 有啥区别?
  9. supervisor监控php进程程序,详解Supervisor进程守护监控(转)
  10. 24点游戏详细截图介绍以及原型、Alpha、Beta对比
  11. 管家机器人先生txt_《管家机器人先生》(主角墨青如玉)大结局全文阅读
  12. Java的Reflection机制
  13. Linux下的Latex安装和中文支持
  14. 表格闪退怎么解决_win10中excel2013闪退怎么修复_win10中excel2013闪退如何解决
  15. Android开机速度优化
  16. 【重识云原生】第六章容器6.3.1节——K8S核心组件总述
  17. 2021年度训练联盟热身训练赛第四场 I.Slot Machines【KMP】
  18. linux禁止软件连接指定网站,利用iptables来配置linux禁止所有端口登陆和开放指定端口...
  19. js中for(const i in/of arr/obj)和vue中v-for指令的区别
  20. 数据库触发器实例讲解

热门文章

  1. Java的笔记开源软件_开源笔记软件(Jarnal)
  2. 双向晶闸管,调压电路,开关电路,楼梯灯电路,光控路灯,无电弧接触器电路
  3. 只需8招,搞定Pandas数据筛选与查询
  4. 吉米多维奇数学分析每日一题--习题1382
  5. Python + OpenCv实现视频中的车辆检测计数(车流量统计) (2020.7.15已更新源码)
  6. python 获取foobar2000官网全部插件
  7. Java简易小说阅读器
  8. 【笔记】概统论与数理统计第四章知识点总结
  9. 机器学习NLP领域入门
  10. java完全自学手册(java完全自学手册pdf洪维恩)