/// <summary> /// [AddMarkPoint] /// MarkPointを追加する /// 引数1: MarkPoint /// </summary> public void AddMarkPoint(BaseMarkPoint point) { if (allTerritorys.Contains(point)) { #if UNITY_EDITOR Debug.LogError("Error!! PlayerInfo->AddMarkPoint\n added point"); #endif return; } //追加->Callback->計算予約 allTerritorys.Add(point); changeTerritoryCallback?.Invoke(); PlayerAndTerritoryManager.instance.ReserveCalucrateTerritory(instanceID); }
/// <summary> /// [AIEnd] /// 関数が実行登録を解除される際に呼ばれるコールバック関数 /// 引数1: 通常実行→次回実行する関数, 割り込み実行の場合→現在の通常実行関数, 存在しない場合null /// </summary> public override void AIEnd(BaseAIFunction nextFunction) { if (functionState == State.Rushing || functionState == State.Rotation) { m_animationController.editAnimation.SetTriggerReturnRun(); } else if (functionState == State.Marking) { m_sePlayer.Stop(m_markingSEIndex); m_markingEffect.SetActive(false); } m_markPoint = null; navMeshAgent.isStopped = false; functionState = State.Null; }
/// <summary>[Awake]</summary> void Awake() { //Managerにインスタンス追加 PlayerAndTerritoryManager.instance.AddPlayer(gameObject, this, m_playerMaualCollisionAdministrator, m_followPoints); //初期ポイントを探す GameObject firstPoint = GameObject.Find(m_firstPointName); m_instanceID = gameObject.GetInstanceID(); //マークポイントを取得 if (firstPoint != null) { m_firstPoint = firstPoint.GetComponent <BaseMarkPoint>(); } //初期ポイントが見つかった if (m_firstPoint != null) { //PlayerInfo取得 var playerInfo = PlayerAndTerritoryManager.instance.allPlayers[m_instanceID].playerInfo; //コールバック追加 playerInfo.changeTerritoryCallback += ChangeTerritory; //ポイントをリンクさせる m_firstPoint.LinkPlayer(gameObject, null); //即時計算要請 PlayerAndTerritoryManager.instance.CalucrateTerritory(playerInfo); //Info設定 m_playerMaualCollisionAdministrator.SetPlayerInfo(playerInfo); m_firstPoint.SetLockFirstPoint(true); m_isPauseFirstPoint = true; } else { //Debug only, エラーログを表示 #if UNITY_EDITOR Debug.LogError("Error!! PlayerTerritoryIntermediary->Start\n FirstPoint not found"); #endif } }
/// <summary> /// [SetSitAndStay] /// おすわり!待て!を設定する /// 引数1: Set value /// 引数2: Link mark point /// </summary> public void SetSitAndStay(bool isSet, BaseMarkPoint markPoint) { if (markPoint == null || isSet == isSitAndStaySelf) { return; } isSitAndStaySelf = isSet; if (isSet) { linkMarkPoint = markPoint; navMeshAgent.updatePosition = false; navMeshAgent.updateRotation = false; } else { linkMarkPoint = null; markPoint.isPauseTimer = false; navMeshAgent.updatePosition = true; navMeshAgent.updateRotation = true; navMeshAgent.Warp(transform.position); } }
/// <summary> /// [GoSoStartOfMarking] /// マーキング開始命令を指示する /// return: 行動実行する場合はtrue, できない場合はfalse /// 引数1: 目標マークポイント /// </summary> public bool GoSoStartOfMarking(BaseMarkPoint markPoint) { //念の為nullチェック if (m_rushingAndMarkingFunction == null) { #if UNITY_EDITOR Debug.LogError("Error!! DogAIAgent->GoSoStartOfMarking\n This Rushing And Marking Function == null"); #endif return(false); } else if (markPoint == null) { #if UNITY_EDITOR Debug.LogError("Error!! DogAIAgent->GoSoStartOfMarking\n markPoint == null"); #endif return(false); } else if (isLinkMarkPoint || m_rushingAndMarkingFunction.functionState != DogRushingAndMarking.State.Null) { #if UNITY_EDITOR Debug.LogError("Error!! DogAIAgent->GoSoStartOfMarking\n Already running"); #endif return(false); } Vector3 position = transform.position, targetPosition = linkPlayer.transform.position; Vector3 direction = (new Vector3(targetPosition.x, 0.0f, targetPosition.z) - new Vector3(position.x, 0.0f, position.z)).normalized; float distance = (targetPosition - position).sqrMagnitude; int instanceID = linkPlayer.GetInstanceID(); //Raycast, Overlap判定(Player) m_raycastHits = Physics.RaycastAll(position, direction, distance, m_playerObeyLayerMask); m_colliders = Physics.OverlapSphere(position, distance, m_playerObeyLayerMask); if (linkPlayer != null && (m_raycastHits.ContainsInstanceID(instanceID) | m_colliders.ContainsInstanceID(instanceID))) { position = targetPosition; targetPosition = markPoint.transform.position; direction = (new Vector3(targetPosition.x, 0.0f, targetPosition.z) - new Vector3(position.x, 0.0f, position.z)).normalized; distance = (targetPosition - position).sqrMagnitude; instanceID = markPoint.gameObject.GetInstanceID(); //Raycast, Overlap判定(MarkPoint) m_raycastHits = Physics.RaycastAll(position, direction, distance, m_playerObeyMarkPointLayerMask); m_colliders = Physics.OverlapSphere(position, distance, m_playerObeyMarkPointLayerMask); if (m_raycastHits.ContainsInstanceID(instanceID) | m_colliders.ContainsInstanceID(instanceID)) { //事前情報入力 m_rushingAndMarkingFunction.SetAdvanceInformation(markPoint, markPoint.transform.position); //関数割り込み実行 ForceSpecifyFunction(m_rushingAndMarkingFunction); return(true); } else { return(false); } } else { return(false); } }
/// <summary> /// [SetAdvanceInformation] /// 実行に必要な事前情報を入力する /// 引数1: 目標ポイント /// 引数2: ポイントの座標 /// </summary> public void SetAdvanceInformation(BaseMarkPoint markPoint, Vector3 position) { m_markPoint = markPoint; m_markPointPosition = position; m_markPointLayerMask.SetValue(markPoint.gameObject); }
/// <summary> /// [SetPoint] /// Set MarkPoint /// </summary> public void SetPoint(BaseMarkPoint markPoint) { this.markPoint = markPoint; this.instanceID = markPoint != null ? markPoint.pointInstanceID : -1; }
/// <summary>[コンストラクタ]</summary> public VisibilityContainer(BaseMarkPoint markPoint) { this.markPoint = markPoint; this.forwardToPositionDot = 0.0f; this.instanceID = markPoint != null ? markPoint.pointInstanceID : -1; }
/// <summary> /// [RemoveMarkPoint] /// BaseMarkPointを登録解除する /// 引数1: BaseMarkPoint /// </summary> public void RemoveMarkPoint(BaseMarkPoint point) { m_points.Remove(point.pointInstanceID); }
/// <summary> /// [AddMarkPoint] /// BaseMarkPointを登録する /// 引数1: BaseMarkPoint /// </summary> public void AddMarkPoint(BaseMarkPoint point) { m_points.Add(point.pointInstanceID, point); }