一、数据定义

(一)、刷怪规则定义:

namespace Common.Data
{public class SpawnRuleDefine{public int ID { get; set; }public int MapID { get; set; }public int SpawnMonID { get; set; }public int SpawnLevel{ get;set; }public SPAWN_TYPE SpawnType { get; set; }public int SpawnPoint { get; set; }public int SpawnPoints { get; set; }public float SpawnPeriod { get; set; }}
}

(二)、DataManger读取EXCEL配置的信息

public class DataManager : Singleton<DataManager>
{public Dictionary<int,Dictionary<int, SpawnPointDefine>> SpawnPoints = null;json = File.ReadAllText(this.DataPath + "SpawnRuleDefine.txt");this.SpawnPoints = JsonConvert.DeserializeObject<Dictionary<int,Dictionary<int, SpawnPointDefine>>>(json);
}

(三)、刷怪点定义

namespace Common.Data
{public class SpawnPointDefine{public int ID { get; set; }//刷怪点IDpublic int MapID { get; set;}public NVector3 Position { get; set; }//位置public NVector3 Direction { get; set; }//朝向}
}

(四)、导出地图中刷怪点的位置信息脚本

 [MenuItem("Map Tools/Export SpawnPoints")]public static void ExportSpawnPoints(){DataManager.Instance.Load();Scene current = EditorSceneManager.GetActiveScene();string currentScene = current.name;if (current.isDirty){EditorUtility.DisplayDialog("提示", "请先保存当前场景", "确定");return;}if (DataManager.Instance.SpawnPoints == null)DataManager.Instance.SpawnPoints = new Dictionary<int, Dictionary<int, SpawnPointDefine>>();foreach (var map in DataManager.Instance.Maps){string sceneFile = "Assets/Scenes/" + map.Value.Resource + ".unity";if (!System.IO.File.Exists(sceneFile)){Debug.LogWarningFormat("Scene {0} not existed!", sceneFile);continue;}EditorSceneManager.OpenScene(sceneFile, OpenSceneMode.Single);SpawnPoint[] SpawnPoints = GameObject.FindObjectsOfType<SpawnPoint>();if (DataManager.Instance.SpawnPoints.ContainsKey(map.Value.ID)){DataManager.Instance.SpawnPoints[map.Value.ID] = new Dictionary<int, SpawnPointDefine>();}foreach (var sp in SpawnPoints){if (!DataManager.Instance.SpawnPoints[map.Value.ID].ContainsKey(sp.ID)){DataManager.Instance.SpawnPoints[map.Value.ID][sp.ID] = new SpawnPointDefine();}SpawnPointDefine def = DataManager.Instance.SpawnPoints[map.Value.ID][sp.ID];def.ID = sp.ID;def.MapID = map.Value.ID;def.Position = GameObjectTool.WorldToLogicN(sp.transform.position);def.Direction = GameObjectTool.WorldToLogicN(sp.transform.forward);}}DataManager.Instance.SaveSpawnPoints();EditorSceneManager.OpenScene("Assets/Scenes/" + currentScene + ".unity");EditorUtility.DisplayDialog("提示", "刷怪点导出完成", "确定");}

二、服务器逻辑

需要有刷怪管理器和怪物管理器,并在Map类中对其进行初始化

1、怪物管理器


namespace GameServer.Managers
{class MonsterManager{private Map Map;public Dictionary<int, Monster> Monsters = new Dictionary<int, Monster>();public void Init(Map map){this.Map = map;}internal Monster Create(int spawnMonID,int spawnLevel,NVector3 position,NVector3 direction){Monster monster = new Monster(spawnMonID, spawnLevel, position, direction);EntityManager.Instance.AddEntity(this.Map.ID, monster);monster.Info.Id = monster.entityId;monster.Info.Mapid = this.Map.ID;Monsters[monster.Id] = monster;this.Map.MonsterEnter(monster);//怪物进入场景 通知客户端刷新怪物return monster;}}
}

2.刷怪管理器

刷怪管理器会根据配置来更新不同地图的刷怪任务

namespace GameServer.Managers
{class SpawnManager{private List<Spawner> Rules = new List<Spawner>();private Map Map;public void Init(Map map){this.Map = map;if (DataManager.Instance.SpawnRules.ContainsKey(map.Define.ID)){foreach(var define in DataManager.Instance.SpawnRules[map.Define.ID].Values){this.Rules.Add(new Spawner(define, this.Map));}}}public void Update(){if (Rules.Count == 0) return;for(int i = 0; i < this.Rules.Count; i++){this.Rules[i].Update();}}}
}

3.刷怪器

    class Spawner{public SpawnRuleDefine Define { get; set; }private Map Map;//刷新时间private float spawnTime = 0;//消失时间private float unspawnTime = 0;private bool spawned = false;//刷怪点位置信息 根据客户端刷怪点信息脚本获取private SpawnPointDefine spawnPoint = null;public Spawner(SpawnRuleDefine define,Map map){this.Define = define;this.Map = map;if (DataManager.Instance.SpawnPoints.ContainsKey(this.Map.ID)){spawnPoint = DataManager.Instance.SpawnPoints[this.Map.ID][this.Define.SpawnPoint];}else{Log.ErrorFormat("SpawnRule[{0}] SpawnPoint[{1}] not existed", this.Define.ID, this.Define.SpawnPoint);}}public void Update(){if (this.CanSpawn()){this.spawn();}}private void spawn(){this.spawned = true;Log.InfoFormat("Map[{0}] Spawn[{1}:Mon:{2},Lv:{3}] at Point:{4}",this.Define.MapID, this.Define.ID, this.Define.SpawnMonID, this.Define.SpawnLevel, this.spawnPoint);//创建怪物this.Map.MonsterManager.Create(this.Define.SpawnMonID, this.Define.SpawnLevel,this.spawnPoint.Position,this.spawnPoint.Direction);}private bool CanSpawn(){if (this.spawned) return false;//上次消失时间+周期 是否大于当前时间if (this.unspawnTime + this.Define.SpawnPeriod > Time.time) return false;return true;}}

4.修改地图管理器

在CharacterEnter方法中加入怪物信息,并通知客户端

 class Map{/// <summary>/// 怪物进入地图/// </summary>/// <param name="character"></param>//广播怪物信息internal void MonsterEnter(Monster monster){Log.InfoFormat("MonsterEnter: Map:{0} monsterId:{1}", this.Define.ID, monster.Id);foreach (var kv in this.MapCharacters){this.AddCharacterEnterMap(kv.Value.connection, monster.Info);}}void AddCharacterEnterMap(NetConnection<NetSession> conn, NCharacterInfo character){if (conn.Session.Response.mapCharacterEnter == null){conn.Session.Response.mapCharacterEnter = new MapCharacterEnterResponse();conn.Session.Response.mapCharacterEnter.mapId = this.Define.ID;}conn.Session.Response.mapCharacterEnter.Characters.Add(character);conn.SendResponse();}//单个角色进入时、也需要添加怪物信息internal void CharacterEnter(NetConnection<NetSession> conn, Character character){//角色进入地图响应conn.Session.Response.mapCharacterEnter = new MapCharacterEnterResponse();conn.Session.Response.mapCharacterEnter.mapId = this.Define.ID;//添加怪物信息foreach (var kv in this.MonsterManager.Monsters){conn.Session.Response.mapCharacterEnter.Characters.Add(kv.Value.Info);}//发送角色进入消息conn.SendResponse();}}

RPG游戏-刷怪系统相关推荐

  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. Silverlight 2.5D RPG游戏技巧与特“.NET技术”效处理:(十一)AI系统

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

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

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

  9. 系统架构之一(RPG游戏常用架构)

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

最新文章

  1. VEND MASTER DATA
  2. 你这辈子可能都不需要看《计算机程序设计艺术》了!
  3. 让你秒懂的折半查找(二分查找)
  4. js比较查看两个数组之间是否相等
  5. openresty + lua
  6. 地图标绘软件_ArcGIS Pro 2.4 首次亮相,Indoors、Monitor、全新一代地图故事模板,新特性抢先看!...
  7. 【高斯消元】球形空间产生器(luogu 4035/金牌导航 高斯消元-1)
  8. beego 例子_beego框架代码分析
  9. About The Quaternion 有关四元数
  10. 超越界限,定义未来-- HP刀片工作站WS460c Gen9无惧4K挑战
  11. 【论文解读】EMNLP2019 如何在Transformer中融入句法树信息?这里给出了一种解决方案...
  12. 获取应用程序根目录物理路径(Web and Windows)
  13. 浅析 路印协议--Loopring 及整体分析 Relay 源码
  14. paip.c++ 内存泄漏以及解决之道.
  15. 为什么RSA 公钥指数(e=65537)
  16. AMD完成对ATI并购 07年推CPU/GPU集成平台
  17. Java学习-ATM系统
  18. 某粉丝网蓝色DZ论坛模板
  19. html居中小圆点点怎么打出来,目录的点怎么打 WORD目录里的点点怎么打
  20. 机器视觉之同轴光的应用

热门文章

  1. Reg Organizer(注册表文件清理器) v8.30.2中文绿色便携版
  2. 尚学堂怎么样?在这里究竟给我带来了哪些收获?
  3. 计算机网络名为pc是什么意思啊,网络pc的意思 什么叫网络pc - 云骑士一键重装系统...
  4. matlab中的mkdir函数_matlab所有函数集合
  5. JavaScript 获取上传文件的本地绝对路径
  6. ZTree的全选 反选 全不选 取消 清空
  7. Python爬虫实战,requests+tqdm模块,爬取漫画数据(附源码)
  8. 华为手机微信如何与电脑连接到服务器,有华为手机,还用微信QQ传文件到电脑?Huawei share秒传了解一下...
  9. 【Verilog基础】一文搞懂线性反馈移位寄存器(LFSR)
  10. 欢迎同学们参加新乡学院2019年3D打印暑期夏令营