/// <summary> /// 设置意图 /// </summary> /// <param name="passerIntent"></param> /// <param name="movePosition"></param> public void SetIntent(PasserIntentEnum passerIntent, TownBuildingEnum buildingEnum, Vector3 eventPosition) { this.passerIntent = passerIntent; StopAllCoroutines(); switch (passerIntent) { case PasserIntentEnum.LeaveTown: IntentForLeaveTown(); break; case PasserIntentEnum.StayInTown: IntentForStayInTown(); break; case PasserIntentEnum.GoToBuilding: IntentForGoToBuilding(buildingEnum); break; case PasserIntentEnum.StayInBuilding: IntentForStayInBuilding(buildingToGo); break; case PasserIntentEnum.LeaveBuilding: IntentForLeaveBuilding(); break; case PasserIntentEnum.GoToEvent: IntentForGoToEvent(eventPosition); break; case PasserIntentEnum.LookOnEvent: IntentForLookOnEvent(); break; } }
/// <summary> /// 协程-逗留倒计时 /// </summary> /// <param name="buildingEnum"></param> /// <returns></returns> public IEnumerator CoroutineForStayTimeCountdown(TownBuildingEnum buildingEnum) { SceneTownManager sceneTownManager = GameScenesHandler.Instance.manager.GetSceneManager <SceneTownManager>(); for (int i = 0; i < 3; i++) { //重新设置地点 movePosition = sceneTownManager.GetRandomBuildingInsidePosition(buildingEnum); characterMoveCpt.SetDestination(movePosition); yield return(new WaitForSeconds(20)); } SetIntent(PasserIntentEnum.LeaveBuilding); }
/// <summary> /// 前往建筑物 /// </summary> public void IntentForGoToBuilding(TownBuildingEnum buildingEnum) { SceneTownManager sceneTownManager = GameScenesHandler.Instance.manager.GetSceneManager <SceneTownManager>(); this.buildingToGo = buildingEnum; //获取建筑的门 sceneTownManager.GetBuildingDoorPosition(buildingEnum, out Vector2 outDoorPostion, out Vector2 inDoorPosition); buildingOutDoorPosition = outDoorPostion; buildingInDoorPosition = inDoorPosition; //前往门 characterMoveCpt.SetDestination(buildingOutDoorPosition); }
/// <summary> /// //随机获取一个要去的地方 /// </summary> public void SetRandomBuildingToGo() { TownBuildingEnum buildingToGo = RandomUtil.GetRandomEnum <TownBuildingEnum>(); if (buildingToGo == TownBuildingEnum.Town) { SetIntent(PasserIntentEnum.StayInTown); } else { SetIntent(PasserIntentEnum.GoToBuilding, buildingToGo); } }
/// <summary> /// 在建筑物内逗留 /// </summary> public void IntentForStayInBuilding(TownBuildingEnum buildingEnum) { //暂时关闭自动寻路(不关闭的话 无法跨范围移动NPC) // characterMoveCpt.CloseNavMeshAgent(); //进入建筑内部 transform.position = buildingInDoorPosition; //设置当前所在地 SetLocation(buildingEnum); //进入建筑后开启自动寻路 // characterMoveCpt.OpenNavMeshAgent(); //开始逛街 SceneTownManager sceneTownManager = GameScenesHandler.Instance.manager.GetSceneManager <SceneTownManager>(); movePosition = sceneTownManager.GetRandomBuildingInsidePosition(buildingEnum); characterMoveCpt.SetDestination(movePosition); //开始逛街 StartCoroutine(CoroutineForStayTimeCountdown(buildingEnum)); }
/// <summary> /// 检测故事 自动触发剧情 /// </summary> public bool EventTriggerForStory(TownBuildingEnum positionType, int OutOrIn) { if (!CheckEventTrigger()) { return(false); } GameDataBean gameData = GameDataHandler.Instance.manager.GetGameData(); StoryInfoBean storyInfo = StoryInfoHandler.Instance.manager.CheckStory(gameData, SceneUtil.GetCurrentScene(), positionType, OutOrIn); if (storyInfo != null) { EventTriggerForStory(storyInfo); return(true); } else { return(false); } }
public StoryInfoBean CheckStory(GameDataBean gameData, ScenesEnum scenesEnum, TownBuildingEnum positionType, int outOrIn) { if (mapStory == null) { return(null); } foreach (long key in mapStory.Keys) { StoryInfoBean storyInfo = mapStory[key]; //TODO 检测条件 //判断场景是否符合 if (scenesEnum != storyInfo.GetStoryScene()) { continue; } //判断该事件是否可重复触发 if (storyInfo.trigger_loop == 0) { //如果已经触发过该事件 if (gameData.CheckTriggeredEvent(storyInfo.id)) { continue; } } //检测触发条件 if (!EventTriggerEnumTools.CheckIsAllTrigger(gameData, storyInfo.trigger_condition)) { continue; } //如果是小镇 if (storyInfo.story_scene == (int)ScenesEnum.GameTownScene) { //判断地点是否正确 if (positionType != (TownBuildingEnum)storyInfo.location_type || outOrIn != storyInfo.out_in) { continue; } } return(storyInfo); } return(null); }
/// <summary> /// 获取建筑物内部顶点坐标 /// </summary> /// <returns></returns> public Vector3 GetRandomBuildingInsidePosition(TownBuildingEnum townBuildingEnum) { if (marketInside == null) { return(Vector3.zero); } Transform tfBuilding = null; switch (townBuildingEnum) { case TownBuildingEnum.Town: tfBuilding = townInside; break; case TownBuildingEnum.Market: tfBuilding = marketInside; break; case TownBuildingEnum.Recruitment: tfBuilding = recruitmentInside; break; case TownBuildingEnum.Grocery: tfBuilding = groceryInside; break; case TownBuildingEnum.Dress: tfBuilding = dressInside; break; case TownBuildingEnum.Carpenter: tfBuilding = carpenterInside; break; case TownBuildingEnum.Guild: tfBuilding = guildInside; break; case TownBuildingEnum.Arena: tfBuilding = arenaInside; break; case TownBuildingEnum.Bank: tfBuilding = bankInside; break; case TownBuildingEnum.Pharmacy: tfBuilding = pharmacyInside; break; case TownBuildingEnum.Casino: tfBuilding = casinoInside; break; case TownBuildingEnum.Brothels: tfBuilding = brothelsInside; break; case TownBuildingEnum.BeautySalon: tfBuilding = beautySalonInside; break; } if (tfBuilding == null) { return(Vector3.zero); } List <Transform> tfList = CptUtil.GetAllCptInChildrenByContainName <Transform>(tfBuilding.gameObject, "Wall_"); if (CheckUtil.ListIsNull(tfList)) { return(Vector3.zero); } Transform tfItem = RandomUtil.GetRandomDataByList(tfList); return(GameUtil.GetTransformInsidePosition2D(tfItem));; }
/// <summary> /// 获取建筑物门的位置 /// </summary> /// <param name="townBuilding"></param> /// <param name="outDoorPosition"></param> /// <param name="inDoorPosition"></param> public void GetBuildingDoorPosition(TownBuildingEnum townBuildingEnum, out Vector2 outDoorPosition, out Vector2 inDoorPosition) { outDoorPosition = Vector2.zero; inDoorPosition = Vector2.zero; switch (townBuildingEnum) { case TownBuildingEnum.Market: outDoorPosition = marketOutDoor.transform.position; inDoorPosition = marketInDoor.transform.position; break; case TownBuildingEnum.Recruitment: outDoorPosition = recruitmentOutDoor.transform.position; inDoorPosition = recruitmentInDoor.transform.position; break; case TownBuildingEnum.Grocery: outDoorPosition = groceryOutDoor.transform.position; inDoorPosition = groceryInDoor.transform.position; break; case TownBuildingEnum.Dress: outDoorPosition = dressOutDoor.transform.position; inDoorPosition = dressInDoor.transform.position; break; case TownBuildingEnum.Carpenter: outDoorPosition = carpenterOutDoor.transform.position; inDoorPosition = carpenterInDoor.transform.position; break; case TownBuildingEnum.Guild: outDoorPosition = guildOutDoor.transform.position; inDoorPosition = guildInDoor.transform.position; break; case TownBuildingEnum.Arena: outDoorPosition = arenaOutDoor.transform.position; inDoorPosition = arenaInDoor.transform.position; break; case TownBuildingEnum.Bank: outDoorPosition = bankOutDoor.transform.position; inDoorPosition = bankInDoor.transform.position; break; case TownBuildingEnum.Pharmacy: outDoorPosition = pharmacyOutDoor.transform.position; inDoorPosition = pharmacyInDoor.transform.position; break; case TownBuildingEnum.Casino: outDoorPosition = casinoOutDoor.transform.position; inDoorPosition = casinoInDoor.transform.position; break; case TownBuildingEnum.Brothels: outDoorPosition = brothelsOutDoor.transform.position; inDoorPosition = brothelsInDoor.transform.position; break; case TownBuildingEnum.BeautySalon: outDoorPosition = beautySalonOutDoor.transform.position; inDoorPosition = beautySalonInDoor.transform.position; break; } }
public void SetIntent(PasserIntentEnum passerIntent, TownBuildingEnum buildingEnum) { SetIntent(passerIntent, buildingEnum, Vector3.zero); }
/// <summary> /// 设置所在地 /// </summary> /// <param name="buildingType"></param> public void SetLocation(TownBuildingEnum buildingType) { npcLocation = buildingType; }