关于NPC系统的思路环节: 加载动画组件,方便控制动画。 加载配置表数据,从Manager那里加。保持Controller不与其他逻辑类接触。 之后做的事:如何能点击到NPC。
第1 碰撞体事件监测。
采用OnMouseDown,可以让鼠标与碰撞器产生交互。
(思考:鼠标放到人身上,如何产生发亮边际)。
-
Manager层
NPC与其他系统产生交互处理,采用事件。(思考:事件与委托有什么具体区别?)
function(NPC的功能)作为key,一个委托作为value,以一个字典保存。事件是NPC接口与其他系统的唯一接口。
玩家与NPC的交互流程: 其他系统(商店还是副本)向NPC管理器注册事件,注册的事件放进了一个委托字典里。 首先接收到Controller层发送来的NPC参数(由玩家鼠标点击时产生交互),先判断NPC是否存在,再执行操作。交互操作时,先判断NPC种类,然后根据种类执行相应的方法。
-
Controller层
OnMouseDown触发交互(注意防止连点,此方法适用于有碰撞器的3D场景对象),通过协程处理交互。
协程处理了NPC人物朝向。
Vector3 faceTo = (User.Instance.CurrentCharacterGameObject.transform.position - transform.position).normalized
得到NPC朝向玩家的方向。用Lerp插值的方式改动人物的面朝向。
(协程里可以作死循环且不影响主线程,但是不能做耗时的逻辑。)
利用
render = this.gameObject.GetComponentInChildren<SkinnedMeshRenderer>();
做高亮处理。
思考:注册事件时,怎么知道点击的是哪个NPC?
答:交互流程以<Function,void UI方法>的形式注册事件→点击NPC→NPC传输自身ID找寻到相应Data→执行注册事件里的UI方法。