using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityGameFramework.Runtime; using System; using YLTask; using TMPro; public enum NpcInteractiveType { Function = 0, // 功能 Main, // 主线 Daily, // 日常 College, // 学院 Wanted, // 悬赏 About, // 关于 Leave // 离开 } public class NpcInfoVo { public NpcInfoVo(int id, Role r) { npcId = id; role = r; } public int npcId; public Role role; public SceneEventNpcLogic npcLogic; } public class SceneEventNpcLogic : MonoBehaviour { public GameObject mapIconObj = null; public SceneEventNpc info = null; private bool isEntry = false; Button btnInteractive; NpcInfoVo npcVo = null; GameObject signObj = null; static bool isOpen = false; Collider nowCollider = null; private void Awake() { isEntry = false; info = this.gameObject.GetComponent(); } // Start is called before the first frame update void Start() { NpcManager.Instance.AddNpcItem(this); AddNameBillboard(); AddNpcSignToMiniMap(mapIconObj); RefreshCollider(); } private void OnEnable() { // 解锁状态 int curMapId = UserProxy.Instance.player.newMap.curMapId; List unlockInfo = MapProxy.Instance.getMapUnlockInfoList(curMapId); foreach (var item in unlockInfo) { string[] unlock = item.Split('_'); if (curMapId != int.Parse(unlock[0])) { continue; } if (int.Parse(unlock[1]) != (int)(SceneEventExplore.ExploreType.Npc)) { continue; } if (info.npcId == int.Parse(unlock[2])) { AnimUnlock(); } } } public void AnimLock() { Animator anim = GetComponent(); anim.Play("lock", 0); } public void AnimUnlock() { Animator anim = GetComponent(); anim.Play("unlock", 0); } public void AddNameBillboard() { ResourceHelper.Instance.LoadAssetBundle("NameBillboard", ab => { if (ab != null) { GameObject billboard = (GameObject)Instantiate(ab.LoadAsset("NameBillboard")); billboard.SetActive(true); billboard.transform.SetParent(this.transform); billboard.transform.localRotation = Quaternion.identity; TextMesh tm = billboard.transform.Find("NameBillboard").GetComponent(); sm_npc npcInfo = sm_npc.GetMoById(info.npcId); tm.text = npcInfo.name; } }); } public void OnTriggerEnter(Collider collider) { nowCollider = null; if (collider.gameObject.layer != LayerMask.NameToLayer("Player")) { return; } if (isOpen) { OnTriggerExit(collider); } ////// 移动中不弹窗 ////if (HeroPlayerController.Instance != null && HeroPlayerController.Instance.GetMoveMagnitude() > 0) ////{ //// return; ////} nowCollider = collider; SetInteractiveBtn(); } public void RefreshInteractiveIcon(ref UI_BaseMainWindow.InteractiveType ittType) { // 添加任务 List taskVos = UserProxy.Instance.player.collectTaskCard.GetActivingCards(); foreach (var item in taskVos) { // 当前步骤 List stepVos = item.curSteps; foreach (var step in stepVos) { if (step.isFinish()) { continue; } if (step.mo().cmd != (int)Enum_TaskCmdType.PlotOver) { continue; } string[] paramList = step.mo().paras.Split(','); int stepNpcID = int.Parse(paramList[0]); int stepStageID = int.Parse(paramList[1]); int showLevel = 0; if (stepNpcID != info.npcId) { continue; } if (item.nMo.GetTaskCardExt().type == (int)TaskCardType.TaskCardType_Chief) { ittType = UI_BaseMainWindow.InteractiveType.NpcTask_Chief; showLevel = 4; return; } else if(showLevel < 3 && item.nMo.GetTaskCardExt().type == (int)TaskCardType.TaskCardType_Daily) { ittType = UI_BaseMainWindow.InteractiveType.NpcTask_Daily; showLevel = 3; } else if (showLevel < 2 && item.nMo.GetTaskCardExt().type == (int)TaskCardType.TaskCardType_College) { ittType = UI_BaseMainWindow.InteractiveType.NpcTask_College; showLevel = 2; } else if (showLevel < 1 && item.nMo.GetTaskCardExt().type == (int)TaskCardType.TaskCardType_Wanted) { ittType = UI_BaseMainWindow.InteractiveType.NpcTask_Wanted; showLevel = 1; } } } } public void SetInteractiveBtn() { UI_BaseMainWindow.InteractiveType ittType = UI_BaseMainWindow.InteractiveType.NpcDialog; switch (info.iconType) { case SceneEventNpc.NpcIconType.Default: ittType = UI_BaseMainWindow.InteractiveType.NpcDialog; break; case SceneEventNpc.NpcIconType.Store: ittType = UI_BaseMainWindow.InteractiveType.Grocery; break; case SceneEventNpc.NpcIconType.Smithy: ittType = UI_BaseMainWindow.InteractiveType.Weapon; break; case SceneEventNpc.NpcIconType.Storehouse: ittType = UI_BaseMainWindow.InteractiveType.Storage; break; case SceneEventNpc.NpcIconType.Teleporter: ittType = UI_BaseMainWindow.InteractiveType.Teleport; break; case SceneEventNpc.NpcIconType.Reword: ittType = UI_BaseMainWindow.InteractiveType.Wanted; break; case SceneEventNpc.NpcIconType.Email: ittType = UI_BaseMainWindow.InteractiveType.Email; break; case SceneEventNpc.NpcIconType.Ranking: ittType = UI_BaseMainWindow.InteractiveType.Ranking; break; case SceneEventNpc.NpcIconType.Entry: ittType = UI_BaseMainWindow.InteractiveType.Teleport; break; case SceneEventNpc.NpcIconType.Export: ittType = UI_BaseMainWindow.InteractiveType.Teleport; break; } RefreshInteractiveIcon(ref ittType); UI_BaseMainWindow.Instance().ShowInteractiveIcon(ittType, (_btn) => { UI_BaseMainWindow.Instance().HideInteractive(); OpenNpcWindow(); }); } public void OpenNpcWindow() { // 唤灵师界面启动时,不开启。 if (UI_NewHeroTeamNewWindow.Instance() != null && UI_NewHeroTeamNewWindow.Instance().gameObject.activeInHierarchy) { return; } // 唤灵师界面启动时,不开启。 if (UI_YanLingZhaoHuanWindow.Instance() != null && UI_YanLingZhaoHuanWindow.Instance().gameObject.activeInHierarchy) { return; } // UI_YanLingZhaoHuanWindow isOpen = true; HideBattleBtn(); npcVo = new NpcInfoVo(info.npcId, nowCollider.gameObject.GetComponent()); npcVo.npcLogic = this; PanelHelper.Instance.ShowPanel("UI_NpcWindow", (GameObject panel) => { }, npcVo); } public void OnTriggerExit(Collider collider) { if (collider.gameObject.layer != LayerMask.NameToLayer("Player")) { return; } UI_BaseMainWindow.Instance().HideInteractive(); PanelHelper.Instance.ClosePanel("UI_NpcWindow"); ShowBattleBtn(); isOpen = false; } public void HideBattleBtn() { if (BattleCanvas.Instance) { BattleCanvas.Instance.SetSkillButtonSatus(false); } } public void ShowBattleBtn() { if (BattleCanvas.Instance) { BattleCanvas.Instance.SetSkillButtonSatus(true); } } public void EnableCollider() { } public void OnClickInteractive() { isEntry = true; EventComponent e = GameEntry.GetComponent(); e.FireNow(this, new BattleEventOpenDialog(info.npcId, info.stageIndex)); UI_BaseMainWindow.Instance().HideInteractive(); } public void RefreshTaskSign() { if (signObj) { GameObject.Destroy(signObj); } if (mapIconObj) { AddNpcSignToMiniMap(mapIconObj); } if (BattleCanvas.Instance && BattleCanvas.Instance.mapCmpt) { BattleCanvas.Instance.mapCmpt.RemoveNpcArrowTarget(this.gameObject); } // 添加任务 List taskVos = TaskProxy.Instance.GetTaskTrackInfo(); foreach (var item in taskVos) { DoTrackTaskCard(item); } } /// /// 进行一项追踪的任务 /// public void DoTrackTaskCard(TaskCardVo vo) { // 当前步骤 List stepVos = vo.curSteps; for (int i = 0; i < stepVos.Count; ++i) { if (stepVos[i].mo().cmd != (int)Enum_TaskCmdType.PlotOver) { continue; } string[] paramList = stepVos[i].mo().paras.Split(','); int stepNpcID = int.Parse(paramList[0]); int stepStageID = int.Parse(paramList[1]); if (stepNpcID != info.npcId) { continue; } if (stepVos[i].isFinish()) { if (BattleCanvas.Instance && BattleCanvas.Instance.mapCmpt) { BattleCanvas.Instance.mapCmpt.RemoveNpcArrowTarget(this.gameObject); } continue; } // 添加领取标志 if (vo.nMo.GetTaskCardExt().type == (int)TaskCardType.TaskCardType_Chief) { // 添加完成标志 if (i >= stepVos.Count - 1) { AddTaskCompleteSign(); } // 添加接取标志 else { AddTaskAcceptSign(); } } // 添加支线 else { // 添加完成标志 if (i >= stepVos.Count - 1) { AddTaskCompleteSignBranch(); } // 添加接取标志 else { AddTaskAcceptSignBranch(); } } } } /// /// 添加任务领取标志 主线任务 /// public void AddTaskAcceptSign() { // 3D场景 ResourceHelper.Instance.LoadAssetBundle("taskSignExclamation", ab => { if (signObj) { GameObject.Destroy(signObj); } signObj = (GameObject)Instantiate(ab.LoadAsset("taskSignExclamation")); signObj.transform.parent = this.transform; signObj.transform.localPosition = new Vector3(0, 2.5f, 0); }); // 小地图 if (mapIconObj) { AddTaskAcceptSignToMiniMap(mapIconObj); BattleCanvas.Instance.mapCmpt.AddNpcArrowTarget(this.gameObject, () => { AddTaskAcceptSignToMiniMap(mapIconObj); this.gameObject.SetActive(false); // Invoke("RefreshCollider", 0.0f);和孟沟通以后,暂时去掉这个任务状态改变后,触发npc窗体的,测试。想法是让玩家手动再触发。 }); } } /// /// 添加任务完成标志 主线任务 /// public void AddTaskCompleteSign() { ResourceHelper.Instance.LoadAssetBundle("taskSignQuestion", ab => { if (signObj) { GameObject.Destroy(signObj); } signObj = Instantiate(ab.LoadAsset("taskSignQuestion")) as GameObject; if (signObj) { signObj.transform.parent = this.transform; signObj.transform.localPosition = new Vector3(0, 3.2f, 0); } }); // 小地图 if (mapIconObj) { AddTaskCompleteSignToMiniMap(mapIconObj); } } /// /// 添加任务领取标志 分支任务 /// public void AddTaskAcceptSignBranch() { // 3D场景 ResourceHelper.Instance.LoadAssetBundle("taskSignExclamation", ab => { if (signObj) { GameObject.Destroy(signObj); } signObj = (GameObject)Instantiate(ab.LoadAsset("taskSignExclamation")); signObj.transform.parent = this.transform; signObj.transform.localPosition = new Vector3(0, 2.5f, 0); }); // 小地图 if (mapIconObj) { AddTaskAcceptSignToMiniMapBranch(mapIconObj); } } /// /// 添加任务完成标志 分支任务 /// public void AddTaskCompleteSignBranch() { ResourceHelper.Instance.LoadAssetBundle("taskSignQuestion", ab => { if (signObj) { GameObject.Destroy(signObj); } signObj = (GameObject)Instantiate(ab.LoadAsset("taskSignQuestion")); signObj.transform.parent = this.transform; signObj.transform.localPosition = new Vector3(0, 3.2f, 0); }); // 小地图 if (mapIconObj) { AddTaskCompleteSignToMiniMapBranch(mapIconObj); } } public void RefreshCollider() { this.gameObject.SetActive(true); } /// /// 任务标识 /// /// public void AddNpcSignToMiniMap(GameObject mapIconObj) { if (mapIconObj == null) { return; } if (info.iconType == SceneEventNpc.NpcIconType.Default) { mapIconObj.transform.Find("npc").gameObject.SetActive(true); } else { mapIconObj.transform.Find("npc").gameObject.SetActive(false); } mapIconObj.transform.Find("taskMS").gameObject.SetActive(false); mapIconObj.transform.Find("taskME").gameObject.SetActive(false); mapIconObj.transform.Find("taskBS").gameObject.SetActive(false); mapIconObj.transform.Find("taskBE").gameObject.SetActive(false); } /// /// 任务领取 主线 /// /// public void AddTaskAcceptSignToMiniMap(GameObject mapIconObj) { mapIconObj.transform.Find("npc").gameObject.SetActive(false); mapIconObj.transform.Find("taskMS").gameObject.SetActive(true); mapIconObj.transform.Find("taskME").gameObject.SetActive(false); mapIconObj.transform.Find("taskBS").gameObject.SetActive(false); mapIconObj.transform.Find("taskBE").gameObject.SetActive(false); } /// /// 任务完成 主线 /// /// public void AddTaskCompleteSignToMiniMap(GameObject mapIconObj) { mapIconObj.transform.Find("npc").gameObject.SetActive(false); mapIconObj.transform.Find("taskMS").gameObject.SetActive(false); mapIconObj.transform.Find("taskME").gameObject.SetActive(true); mapIconObj.transform.Find("taskBS").gameObject.SetActive(false); mapIconObj.transform.Find("taskBE").gameObject.SetActive(false); } /// /// 任务领取 支线 /// /// public void AddTaskAcceptSignToMiniMapBranch(GameObject mapIconObj) { mapIconObj.transform.Find("npc").gameObject.SetActive(false); mapIconObj.transform.Find("taskMS").gameObject.SetActive(false); mapIconObj.transform.Find("taskME").gameObject.SetActive(false); mapIconObj.transform.Find("taskBS").gameObject.SetActive(true); mapIconObj.transform.Find("taskBS").gameObject.SetActive(false); } /// /// 任务完成 支线 /// /// public void AddTaskCompleteSignToMiniMapBranch(GameObject mapIconObj) { mapIconObj.transform.Find("npc").gameObject.SetActive(false); mapIconObj.transform.Find("taskMS").gameObject.SetActive(false); mapIconObj.transform.Find("taskME").gameObject.SetActive(false); mapIconObj.transform.Find("taskBS").gameObject.SetActive(false); mapIconObj.transform.Find("taskBE").gameObject.SetActive(true); } }