public double[] GetRampData() { double[] temp = new double[AIData.GetLength(1)]; for (int i = 0; i < AIData.GetLength(1); i++) { temp[i] = AIData[0, i]; } return(temp); }
public void createNewShape() { int howTo = PlayerPrefs.GetInt("HOW_TO", 0); if (howTo == 0) { StartCoroutine(showHowTo()); // showHowTo(); return; } else { howToPanel.SetActive(false); } if (currentMaxHeight > 10) { //gameover return; } counter++; // if(counter > 1) // { // return; // } int index = 0; int angle = 0; if (currentMaxHeight == 0)// || true) { index = Random.Range(0, shapePrefabs.Count); } else { AIData ad = getOptimizedShape(); index = ad.index; angle = ad.rotation; // index =7; } LevelHandler levelHandler = baseObject.GetComponent <LevelHandler>(); GameObject prefab = shapePrefabs[index]; // Debug.Log("ad.index "+ ad.index); // Quaternion.Euler(new Vector3(0f, levelHandler.startingAngle - 45f, 0f) GameObject newShape = GameObject.Instantiate(prefab, spawnPoint.transform.position, Quaternion.identity); newShape.transform.position = new Vector3(baseObject.transform.position.x, spawnPoint.transform.position.y, baseObject.transform.position.z); shapeScript = newShape.GetComponent <Shape>(); shapeScript.setGameManager(this); shapeScript.setShapeMoving(true, true); shapeScript.startingAngle = 0; newShape.name = "" + index + "-" + counter; }
private IEnumerator Explode(AIData aiData) { yield return(new WaitForSeconds(explosionLifetime + 1)); if (aiData != null) { aiData.updateBehavior = true; } Destroy(this.gameObject); }
// Apply // Override this given the type of // signal that needs to be applied private void Apply(GameObject g, AIData data) { if (ReferenceEquals(g, null)) { return; } //modification #region SignalAnimations string mood = null; float mostInfluential = 0; int sign = 0; #endregion if (moodMod != null) { // iterate thru all the keys foreach (string key in moodMod.Keys) { // extract modifier float mod = moodMod[key]; //Debug.Log("Mod of signal is: key, mod" + key + ", " + mod); // as long is it's non zero.... if (mod != 0) { // update signal animation if (Mathf.Abs(mod) >= Mathf.Abs(mostInfluential)) { mostInfluential = mod; mood = key; sign = (int)Mathf.Sign(mod); } //Debug.Log("Signal Animator(mostInfluential, mood, sign) : (" + mostInfluential + ", " + mood + ", " + sign + ")"); float value = data.moods[key]; value = Mathf.Clamp((value + mod), 0f, 1f); data.moods[key] = value; //Debug.Log("--->" + g.name + "'s " + key + " value should be " + value); } } } else { //Debug.Log("****************Mood mod of this signal is null: " + this.gameObject.name); } //change middle argument based on creatures offset GameObject child = null; SignalAnimator(mostInfluential, mood, sign, child, g); // child.GetComponent<Animator>().Play("FearUpAnimation"); // set decision timer to 0 // THIS MAKES THEM THINK WAYYYYYYY TOO FAST // data.ManualDecision(); }
public override void ResetScoreData() { CurData = new AIData(CurDivision, CurRound, CurPool, CurTeam); VarietyNS.NumberValue = 0; TeamworkNS.NumberValue = 0; MusicNS.NumberValue = 0; FlowNS.NumberValue = 0; FormNS.NumberValue = 0; GeneralNS.NumberValue = 0; }
public double[] GetLaserData(string laser) { double[] temp = new double[AIData.GetLength(1)]; int channel = AIChannelsLookup[laser]; for (int i = 0; i < AIData.GetLength(1); i++) { temp[i] = AIData[channel, i]; } return(temp); }
// Start is called before the first frame update void Start() { Data = new AIData(); Data.speed = 0; Data.arriveRange = 5.0f; Data.maxSpeed = 2.5f; Data.maxRotate = 5.0f; Data.goal = gameObject; Data.target = Vector3.zero; mCurrentPath = 1; }
internal override void PerformAI(AIData data) { try { this.Api.PerformAI(data); } catch (Exception ex) { base.LastException = ex; throw; } }
public void LoadAutosave(string InFilename) { try { FileStream File = new FileStream(InFilename, FileMode.Open); CurData = AIData.Load(File); File.Close(); } catch (System.Exception e) { Debug.Log("Load autosave exception: " + e.Message); } }
private GameObject SpawnAI(AI_TYPE InType, AI_LEVEL InLevel, GameObject InParent) { // for test InLevel = (AI_LEVEL)Mathf.Min((int)InLevel, AI_Level_Limit[(int)InType]); AIData AIToSpawn = List_AIData.Find(it => InType == it.type && InLevel == it.level); string prefabName = AIData.AI_Name[(int)AIToSpawn.type] + (int)AIToSpawn.level; GameObject AI = Resources.Load(Config.Folder_AITraffic + prefabName) as GameObject; AI = Instantiate(AI, InParent.transform.position - InParent.GetComponent <TrafficStation>().Offset, Quaternion.identity); return(AI); }
private void Start() { InitializeDictionary(); spriteRenderer = GetComponent <SpriteRenderer>(); sfxPlayer = GetComponent <AudioSource>(); // differentiate between ai and char data characterData = GetComponent <AIData>(); if (characterData == null) { characterData = (AIData)GetComponent <CharacterData>(); } }
public AIData(AIData InData) { JudgeNameId = InData.JudgeNameId; Division = InData.Division; Round = InData.Round; Pool = InData.Pool; Team = InData.Team; Variety = InData.Variety; Teamwork = InData.Teamwork; Music = InData.Music; Flow = InData.Flow; Form = InData.Form; General = InData.General; }
/// <summary>Updates the AI.</summary> /// <returns>The AI response.</returns> internal AIResponse UpdateAI() { if (this.SupportsAI) { AIData data = new AIData(GetHandles()); this.PerformAI(data); if (data.Response != AIResponse.None) { SetHandles(data.Handles, false); } return(data.Response); } return(AIResponse.None); }
// Start is called before the first frame update void Start() { player = GameObject.FindGameObjectWithTag("Player"); controller = player.GetComponent <PlayerController>(); playerRenderer = player.GetComponent <SpriteRenderer>(); playerData = player.GetComponent <PlayerData>(); fruitantData = thisFruitant.GetComponent <AIData>(); fruitantController = thisFruitant.GetComponent <MonsterController>(); fruitantRenderer = thisFruitant.GetComponent <SpriteRenderer>(); dust = player.GetComponentInChildren <ParticleSystem>(); audioSource = this.GetComponent <AudioSource>(); }
internal override void PerformAI(AIData data) { #if !DEBUG try { #endif this.Api.PerformAI(data); #if !DEBUG } catch (Exception ex) { base.LastException = ex; throw; } #endif }
public void ReceiveAIData(string JudgeGuid, string InData) { AIData NewAiData = AIData.Load(Global.GenerateStreamFromString(InData)); if (NewAiData != null) { TeamData TData = Global.GetTeamData(NewAiData.Division, NewAiData.Round, NewAiData.Pool, NewAiData.Team); if (TData != null) { bool bNewScore = TData.RoutineScores.SetAIResults(NewAiData); OnRecievedResultsData(bNewScore); } } }
public Creature() { EditorID = new SimpleSubrecord <String>("EDID"); ObjectBounds = new ObjectBounds("OBND"); UnarmedAttackAnimation = new SimpleSubrecord <UInt16>("EAMT"); BaseStats = new CreatureBaseStats("ACBS"); AIData = new AIData("AIDT"); Data = new CreatureData("DATA"); AttackReach = new SimpleSubrecord <Byte>("RNAM"); TurningSpeed = new SimpleSubrecord <Single>("TNAM"); BaseScale = new SimpleSubrecord <Single>("BNAM"); FootWeight = new SimpleSubrecord <Single>("WNAM"); ImpactMaterialType = new SimpleSubrecord <MaterialTypeUInt>("NAM4"); SoundLevel = new SimpleSubrecord <SoundLevel>("NAM5"); }
public bool GetAStarSeekPoint(AIData data, ref int currentIndex,ref Vector3 rPos){ //目前所在的index, int iLength = m_PathList.Count; Vector3 vPos; //從終點抓回去 for(int i = iLength - 1; i >= currentIndex; i--) { vPos = (Vector3)m_PathList[i]; bool bCol = Physics.Linecast(data.thisPoint.transform.position, vPos, 1 << LayerMask.NameToLayer("Obstacle")); //bool bCol = Physics.Linecast(tPos, vPos, 1 << LayerMask.NameToLayer("Obstacle")); if(bCol == false) { //如果沒有撞到牆壁代表可走 currentIndex = i; rPos = vPos; return true; } } return false; }
// ApplyToAll private void ApplyToAll() { foreach (GameObject g in hitList) { if (g != null) { if (g.tag != "Player") { //Debug.Log("APPLY TO HIT: " + g.name); // get data AIData data = g.GetComponent <AIData>(); // apply Apply(g, data); } } } }
private void LoadData() { Debug.Log($"Loading AI data from '{TestAssetPath}'..."); AIData data = AssetDatabase.LoadAssetAtPath <AIData>(TestAssetPath); if (null == data) { Debug.LogError("Could not load AI data!"); return; } foreach (AIState state in data.States) { AIEditorNode stateNode = new AIEditorNode(state.EditorPosition, state.Name, this); AddNode(stateNode); // TODO: check for overwrites _states[state.Id] = stateNode; } foreach (AIStateTransition stateTransition in data.StateTransitions) { AIEditorNode startNode = _states.GetOrDefault(stateTransition.StartState); if (null == startNode) { Debug.Log($"No such start state {stateTransition.StartState}!"); continue; } AIEditorNode endNode = _states.GetOrDefault(stateTransition.EndState); if (null == endNode) { Debug.Log($"No such end state {stateTransition.EndState}!"); continue; } AIEditorEdge stateEdge = new AIEditorEdge(this) { StartNode = startNode, EndNode = endNode }; AddEdge(stateEdge); } }
//constructor public AIGameStateManager(AIData startingData) { //make the Game State Info Contrainers AIGameStateInfo = new FactionGameStateInfo(FactionController.OtherFaction1, TowerController.GetTowerCountForFaction(FactionController.OtherFaction1)); playerGameStateInfo = new FactionGameStateInfo(FactionController.PlayerFaction, TowerController.GetTowerCountForFaction(FactionController.PlayerFaction)); //Subscribed to necessary events TowerController.TowerConverted += TowerHasChangedFaction; ConvergenceController.ConvergenceOccurred += OnConvergence; List <TowerBehavior> towers = TowerController.GetAllTowers(); //each individual tower has an upgrade event(not static so we need to subscribe to all of them) foreach (TowerBehavior tower in towers) { tower.Upgraded += TowerUpgraded; } numConvergences = 0; currentData = startingData; }
void compareMats(int[,] top, int[,] prefab, int rotate, int index, ref AIData ad) { int[,] ranked = new int[3, 3]; for (int h = 0; h < GameConstants.TOWER_Y; h++) { for (int i = 0; i < GameConstants.TOWER_X; i++) { ranked[i, h] = prefab[i, h] - top[i, h]; } } ad.rotation = rotate; ad.index = index; calculateFits(ranked, top, prefab, ref ad); // best fit // perfect fit }
public bool SetAIResults(AIData InData) { if (InData.JudgeNameId == -1) { return(false); } ResultsData rd = TournamentData.FindResultsData(InData.Division, InData.Round, InData.Pool); int ResultIndex = -1; for (int i = 0; i < rd.AIJudgeIds.Count; ++i) { if (InData.JudgeNameId == rd.AIJudgeIds[i]) { ResultIndex = i; break; } } bool bNewScore = false; if (ResultIndex >= 0) { for (int DataIndex = 0; DataIndex <= ResultIndex; ++DataIndex) { if (DataIndex >= AIResults.Count) { AIResults.Add(new AIData()); } } if (!AIResults[ResultIndex].IsValid()) { bNewScore = true; } AIResults[ResultIndex] = InData; } return(bNewScore); }
void DrawBackupList() { Rect BackupArea = new Rect(20, 100, Screen.width - 40, Screen.height - 150); GUILayout.BeginArea(BackupArea); GUILayout.BeginVertical(); BackupAreaScrollPos = GUILayout.BeginScrollView(BackupAreaScrollPos); foreach (BackupAIData bd in BackupList) { GUILayout.BeginHorizontal(); string BackupStr = GetBackupDisplayString(bd) + " | V: " + bd.Data.Variety + " T: " + bd.Data.Teamwork + " M: " + bd.Data.Music + " Fw: " + bd.Data.Flow + " Fm: " + bd.Data.Form; GUIStyle LabelStyle = new GUIStyle("label"); GUIContent BackupContent = new GUIContent(BackupStr); GUILayout.Label(BackupContent, GUILayout.MaxWidth(LabelStyle.CalcSize(BackupContent).x + 20)); if (GUILayout.Button("Load")) { bIsChoosingBackup = false; //bBackupLoaded = true; CurData = bd.Data; //CurBackupData = bd; HeaderDrawer.CanvasGO.SetActive(true); JudgerCanvasUI.SetActive(true); VarietyNS.NumberValue = CurData.Variety; TeamworkNS.NumberValue = CurData.Teamwork; MusicNS.NumberValue = CurData.Music; FormNS.NumberValue = CurData.Form; FlowNS.NumberValue = CurData.Flow; GeneralNS.NumberValue = CurData.General; } GUILayout.EndHorizontal(); } GUILayout.EndScrollView(); GUILayout.EndVertical(); GUILayout.EndArea(); }
public NonPlayerCharacter() { EditorID = new SimpleSubrecord <String>("EDID"); ObjectBounds = new ObjectBounds("OBND"); Model = new Model(); BaseStats = new NPCBaseStats("ACBS"); VoiceType = new RecordReference("VTCK"); Race = new RecordReference("RNAM"); UnarmedAttackAnimation = new SimpleSubrecord <UInt16>("EAMT"); AIData = new AIData("AIDT"); Class = new RecordReference("CNAM"); Data = new NPCData("DATA"); HairColor = new SimpleSubrecord <Color>("HCLR"); ImpactMaterialType = new SimpleSubrecord <MaterialTypeUInt>("NAM4"); FaceGenGeometrySymmetric = new SimpleSubrecord <byte[]>("FGGS", new byte[4]); FaceGenGeometryAsymmetric = new SimpleSubrecord <byte[]>("FGGA", new byte[4]); FaceGenTexture = new SimpleSubrecord <byte[]>("FGTS", new byte[4]); Unknown = new SimpleSubrecord <UInt16>("NAM5"); Height = new SimpleSubrecord <Single>("NAM6"); Weight = new SimpleSubrecord <Single>("NAM7"); }
private void Awake() { closestDistance = Mathf.Infinity; AiData = GetComponent <AIData>(); GameObject soma = GameObject.FindGameObjectWithTag("Player"); // Know who is friend and foe Friends = AiData.Friends; Enemies = AiData.Enemies; Friends.Add(soma); // clear often AllCreatures = new List <GameObject>(); AllPlants = new List <GameObject>(); AllDrops = new List <GameObject>(); // specials specialPosition = transform.position; SetCurrentTile(); }
private static Vector3 DoSeek(ref AIData data) { Vector3 vForce = Vector3.zero; Vector3 vToTarget = data.vTargetPosition - data.go.transform.position; Vector3 vDesired = Vector3.Normalize(vToTarget) * data.fMaxSpeed; /* * float fDistance = vToTarget.magnitude; * * if (fDistance < 1.0f) { * * //開始減速 * vDesired = Vector3.Normalize (vDesired) * data.fMaxSpeed * (fDistance / 1.0f); * * }*/ vForce = vDesired - data.vVelocity; return(vForce); }
private void averageRampData(int numAverages) { double[,] updatedOldRampData; if (oldRampData != null) { int oldRampDataNumRecords = oldRampData.GetLength(2); int updatedOldRampDataNumRecords = oldRampData.GetLength(2) >= numAverages ? numAverages : oldRampDataNumRecords + 1; updatedOldRampData = new double[updatedOldRampDataNumRecords, AIData.GetLength(1)]; for (int record = 0; record < updatedOldRampDataNumRecords - 1; record++) { for (int i = 0; i < updatedOldRampData.GetLength(1); i++) { updatedOldRampData[record, i] = oldRampData[record, i + 1]; } } for (int i = 0; i < updatedOldRampData.GetLength(1) - 1; i++) { updatedOldRampData[updatedOldRampDataNumRecords - 1, i] = AIData[0, i]; } double[] averageRampData = new double[updatedOldRampData.GetLength(1)]; for (int i = 0; i < updatedOldRampData.GetLength(1) - 1; i++) { double total = 0; for (int record = 0; record < updatedOldRampDataNumRecords - 1; record++) { total += updatedOldRampData[record, i]; } AIData[0, i] = total / updatedOldRampDataNumRecords; } } else { updatedOldRampData = new double[1, AIData.GetLength(1)]; for (int i = 0; i < updatedOldRampData.GetLength(1) - 1; i++) { updatedOldRampData[0, i] = AIData[0, i]; } } }
private static void ReadAndInit(AIData data) { var requiresInit = new List <IInitializeAfterDeserialization>(); try { data.ai = SerializationMaster.Deserialize <UtilityAI>(data.storedData.configuration, requiresInit); data.ai.name = data.storedData.name; } catch (Exception e) { Debug.LogWarning(string.Format("Unable to load the AI: {0}. Additional details: {1}\n{2}", data.storedData.name, e.Message, e.StackTrace)); return; } var initCount = requiresInit.Count; for (int i = 0; i < initCount; i++) { requiresInit[i].Initialize(data.ai); } }
public static void Steering(ref AIData data) { data.vSteering = Vector3.ClampMagnitude(data.vSteering, data.fMaxForce); Vector3 vVelocity; vVelocity = Vector3.ClampMagnitude(data.vVelocity + data.vSteering, data.fMaxSpeed); // data.vTemp1 = data.vSteering * 3.0f; // Get Velocity data.vVelocity = Vector3.ClampMagnitude(data.vVelocity + data.vSteering, data.fMaxSpeed); //轉向 data.go.transform.forward = Vector3.Normalize(data.vVelocity); //位移 data.go.transform.position += data.vVelocity * Time.deltaTime; //Reset data.vSteering = Vector3.zero; }
private void Start() { #region Initialize #region GetComponents AiData = GetComponent <AIData>(); Checks = AiData.GetComponent <MonsterChecks>(); AnimatorBody = GetComponent <Animator>(); RigidBody = GetComponent <Rigidbody2D>(); controller = GetComponent <MonsterController>(); pathfinder = GetComponent <Pathfinder>(); flavor = GetComponent <FlavorInputManager>(); sfxPlayer = GetComponent <PlaySFX>(); #endregion ActionTimer = -1f; ActionTimerReset = 5f; ActionTimerVariance = 2f; ResetTimer = -1f; ResetTimerReset = 6f; ResetTimerVariance = 2f; ResetMovementBias(); #endregion }
//因為是複寫的,所以是override public override void CheckState (AIData data){ if (bArrival) { bArrival = false; data.m_State.PerformTransition (eTransitionID.Wander_To_Idle, data); } }
//做State的切換 public void PerformTransition(eTransitionID tID, AIData data){ if(tID == eTransitionID.None){ return; } eStateID sID = m_currentState.GetOutputStateID (tID); if (sID == eStateID.None) { return; } m_currentStateID = sID; int iCount = m_State.Count; for (int i = 0; i < iCount; i++) { if (m_State [i].m_StateID == m_currentStateID) { m_currentState.DoBeforeLeave (data); m_currentState = m_State [i]; m_currentState.DoBeforeEnter (data); break; } } }
//因為是複寫的,所以是override public override void CheckState (AIData data){ if(fTime > fIdleTime){ data.m_State.PerformTransition(eTransitionID.Idle_To_Track, data); } }
public override void DoBeforeEnter (AIData data) { data.targetPoint = null; fTime = 0.0f; fTrackTime = 2.0f; data.iAstarIndex = -1; }
public void InitAI(int aiID) { self = GetComponent<Enemy>(); data = DataManager.Instance.GetEnemyDataSet ().GetAIData (aiID); }
public override void DoState (AIData data){ //Debug.Log ("前往目標"); m_GameObject = data.thisPoint; nComponent = m_GameObject.GetComponent<NPC> (); //如果沒有小於攻擊範圍,就追逐 if (data.iAstarIndex > -1) { //Debug.Log ("iAstarIndex" + data.iAstarIndex); //Debug.Log ("GetPathPointNumber" + (nComponent.m_AStar.GetPathPointNumber () - 1)); if (data.iAstarIndex < (nComponent.m_AStar.GetPathPointNumber () - 1)) { //多久做一次找seek點,會影響效能 //Debug.Log ("多久做一次找seek點,會影響效能"); nComponent.m_AStar.GetAStarSeekPoint (data, ref data.iAstarIndex, ref data.targetPosition); //m_AStar.GetAStarSeekPoint (this.transform.position, ref m_AIData.iAstarIndex, ref m_AIData.targetPosition); } //m_Seek (this.gameObject, m_AIdata); if (AIBehavior.OBS (data.thisPoint, data, false) == false) { //如果沒有撞到東西 if (AIBehavior.Seek (data.thisPoint, data) == false) { data.iAstarIndex = -1; } } AIBehavior.MoveForward (data.thisPoint, data); //一定時間重新計算目標 if (fTime > fTrackTime) { data.targetPoint = null; //把目標清掉 data.iAstarIndex = -1; fTime = 0.0f; } fTime += Time.deltaTime; //返回 return; } else { if (nComponent.m_AStar.AStarSearch (nComponent.m_AStar.transform.position, data.targetPosition)) { //如果傳給Astar的結果為true,iAstarIndex設為0 data.iAstarIndex = 0; } } Debug.Log (data.thisPoint+"目前狀態:" + m_StateID); }
public override void DoBeforeLeave (AIData data){ data.iAstarIndex = -1; }
//virtual 關鍵字的用途是修改方法、屬性、索引子 (Indexer) 或事件宣告,以及允許在衍生類別 (Derived Class) 中予以覆寫。例如,這個方法可由任一繼承它的類別來覆寫 //當離開State前要做什麼 public virtual void DoBeforeEnter (AIData data){ }
//做State public abstract void DoState (AIData data);
//現在這個Transition有沒有被達成是否該切換 public abstract void CheckState (AIData data);
public override void DoState (AIData data){ Debug.Log (data.thisPoint + "目前狀態:" + m_StateID); m_GameObject = data.thisPoint; pComponent = m_GameObject.GetComponent<Player>(); if (bTest == false && vForward == Vector3.zero) { if (iHit == 0) { //選擇攻擊 //不在攻擊範圍,移動 //在攻擊範圍,攻擊 //選擇技能 //直接放技能,依照範圍判定有被傷害的目標 //pComponent.iNowEgo = Player.eEgo.Run; iSlotFSM = -1; Debug.Log ("移動到目標中"); data.targetPosition = data.targetPoint.gameObject.transform.position; tVec = data.targetPosition - data.thisPoint.gameObject.transform.position; data.thisPoint.transform.forward = tVec; fDist = tVec.magnitude; ObjectPool.m_Instance.FindObjectToPool(out iSlotFSM, data.targetPoint.gameObject); if (fDist < data.fAttackLength) { Debug.Log ("到達攻擊範圍"); //pComponent.iNowEgo = Player.eEgo.Attac; m_GameObject = data.targetPoint; nComponent = m_GameObject.GetComponent<NPC>(); //攻擊動作 Debug.Log ("fTime:"+fTime); Debug.Log ("fAttackTime:"+fAttackTime); if (fTime > fAttackTime) { fTime = 0.0f; nComponent.m_AIData.fHP -= data.fAttack; if(nComponent.m_AIData.fHP <= 0){ nComponent.m_AIData.fHP = 0; } if(nComponent.m_AIData.fHP == 0.0f){ ObjectPool.m_Instance.UnLoadObjectToPool(out iSlotFSM, data.targetPoint.gameObject); data.targetPoint = null; //return; //回到idle狀態 //data.m_State.PerformTransition (eTransitionID.Attack_To_Idle, data); } iHit = -1; //pComponent.iNowEgo = Player.eEgo.Idle; //data.m_State.PerformTransition (eTransitionID.Attack_To_Idle, data); } fTime += Time.deltaTime; return; } else { if (AIBehavior.OBS (data.thisPoint, data, false) == false) {//如果沒有撞到東西 if (AIBehavior.Seek (data.thisPoint, data) == false) { //pComponent.iNowEgo = Player.eEgo.Idle; bArrival = true; return; } } AIBehavior.MoveForward (data.thisPoint, data); } } //選擇技能 //直接放技能,依照範圍判定有被傷害的目標 // /* else if (iHit == 1) { pComponent.iNowEgo = Player.eEgo.Run; //Player.m_Instance.iNowEgo = Player.eEgo.Run; Debug.Log ("移動到目的地中"); Debug.Log (data.thisPoint.transform.position); data.thisPosition = data.thisPoint.transform.position; if (AIBehavior.OBS (data.thisPoint, data, false) == false) {//如果沒有撞到東西 if (AIBehavior.Seek (data.thisPoint, data) == false) { pComponent.iNowEgo = Player.eEgo.Idle; bArrival = true; return; } } AIBehavior.MoveForward (data.thisPoint, data); }*/ } //bTest = false; return; }
//因為是複寫的,所以是override public override void CheckState (AIData data){ if (Input.GetMouseButtonDown (0)) { bTest = false; Ray r = Camera.main.ScreenPointToRay (Input.mousePosition); RaycastHit rHit; if (Physics.Raycast (r, out rHit, 100000.0f, 1 << LayerMask.NameToLayer ("Enemy"))) { if (rHit.collider.gameObject.layer == 10) {//10是Enemy的Layer iHit = 0; data.targetPoint = rHit.collider.gameObject; data.targetPosition = data.targetPoint.gameObject.transform.position; tVec = data.targetPosition - data.thisPoint.gameObject.transform.position; data.thisPoint.gameObject.transform.forward = tVec; } }/* else if (Physics.Raycast (r, out rHit, 100000.0f, 1 << LayerMask.NameToLayer ("Terrain"))) { iHit = 1; data.targetPoint = null; data.targetPosition = rHit.point; tVec = data.targetPosition - data.thisPoint.gameObject.transform.position; data.thisPoint.gameObject.transform.forward = tVec; //Debug.Log (data.targetPosition); }*/ } }
public override void DoBeforeEnter (AIData data){ data.targetPoint = null; }
public override void DoState (AIData data){ Debug.Log (data.thisPoint+"目前狀態:" + m_StateID); if (AIBehavior.OBS (data.thisPoint, data, false) == false) { //如果沒有撞到東西 if (AIBehavior.Seek (data.thisPoint, data) == false) { bArrival = true; return; } } AIBehavior.MoveForward (data.thisPoint, data); }
public override void DoBeforeEnter (AIData data) { Vector3 tVec = data.targetPoint.transform.position - data.thisPoint.transform.position; tVec.y = 0.0f; tVec.Normalize(); data.thisPoint.transform.forward = tVec; fTime = 0.0f; fSkillTime = 1.0f; }
public override void DoState (AIData data){ Debug.Log (data.thisPoint + "目前狀態:" + m_StateID); //取出Component m_pGameObject = data.targetPoint; pComponent = m_pGameObject.GetComponent<Player> (); //m_nGameObject = data.thisPoint; //nComponent = m_nGameObject.GetComponent<NPC> (); //完 //=============================測試用============================= Color r = Color.black; r.r = Random.Range (0.0f, 1.0f); r.g = Random.Range (0.0f, 1.0f); r.b = Random.Range (0.0f, 1.0f); data.thisPoint.GetComponent<Renderer> ().material.color = r; //=============================完============================= if (fTime > fAttackTime) { pComponent.m_AIData.fHP -= data.fAttack; data.fMP += 5.0f; //============================攻擊紀錄============================ //Debug.Log (data.thisPoint + "===普通攻擊擊中===" + m_pGameObject); //Debug.Log (m_pGameObject + "===被普通攻擊===" + data.fAttack + "===擊中後的血量===" + pComponent.m_AIData.fHP); //============================完============================ //=============================防呆============================= if (pComponent.m_AIData.fHP <= 0) { pComponent.m_AIData.fHP = 0; } if (data.fMP >= data.fMaxMP) { data.fMP = data.fMaxMP; } //=============================完============================= //Debug.Log (pComponent.m_AIData.fHP); if (pComponent.m_AIData.fHP == 0.0f) { ObjectPool.m_Instance.UnLoadObjectToPool (out iSlotFSM, data.targetPoint.gameObject); data.m_State.PerformTransition (eTransitionID.Attack_To_Idle, data); } //=============================測試用============================= data.thisPoint.GetComponent<Renderer> ().material.color = Color.white; //=============================完============================= data.m_State.PerformTransition (eTransitionID.Attack_To_Idle, data); } fTime += Time.deltaTime; }
public static void MoveForward(GameObject go, AIData data) { Vector3 cFor = go.transform.position + go.transform.forward * data.fspeed * Time.deltaTime; //go.transform.position = vNPos; go.transform.position = cFor; }
private void Start() { RandomSpeed = Random.Range(-2.0f, 2.0f); Data = GetComponent<AIData>(); Data.Home = transform.position; Mesh mesh; if (FindObjectOfType<SkinnedMeshRenderer>()) { mesh = FindObjectOfType<SkinnedMeshRenderer>().sharedMesh; Size = mesh.bounds.size.x + mesh.bounds.size.y + mesh.bounds.size.z; } else if (FindObjectOfType<MeshFilter>()) { mesh = FindObjectOfType<MeshFilter>().mesh; Size = mesh.bounds.size.x + mesh.bounds.size.y + mesh.bounds.size.z; } else { Size = 3; } if (Flying) { InvokeRepeating("FindPath", Random.Range(0.0f, RefreshRate), RefreshRate / 2); } else { InvokeRepeating("FindPath", Random.Range(0.0f, RefreshRate), RefreshRate); } StartCoroutine(UpdateState()); //Start state updater }
public static bool OBS(GameObject go, AIData data, bool bTest){ Obstacle [] obs = data.m_Obs; int iLength = obs.Length; Vector3 tPos; Vector3 tVec; Vector3 cPos = go.transform.position; Vector3 cFor = go.transform.forward; float fDist = 0.0f;; float fTotalR = 0.0f; float fDot; float fTheta; float fSinLen = 0.0f; Obstacle mMinObs = null; float fMinDist = 10000.0f; //設一個值用來比較目前最小距離 float fMinDot = 0.0f; Vector3 tMinVec = Vector3.zero; float fMinTotalR = 0.0f; for (int i=0; i<iLength; i++) { tPos = obs [i].transform.position; tVec = tPos - cPos; fDist = tVec.magnitude; fTotalR = data.fRadius + obs [i].fObsRadius; //兩者距離>探針長度+兩者的radius,跳過 if (fDist > data.fColProbe + fTotalR) { continue; } //Dot<0,在背面,跳過 tVec.Normalize (); fDot = Vector3.Dot (cFor, tVec); if (fDot < 0.01f) { continue; } else if (fDot > 1.0f) { fDot = 1.0f; } //sin距離>兩者的radius,跳過 fTheta = Mathf.Acos(fDot); fSinLen = fDist*Mathf.Sin(fTheta); if(fSinLen > fTotalR){ continue; } if(bTest){ return true; } if(fDist < fMinDist){ mMinObs = obs[i]; fMinDist = fDist; fMinDot = fDot; tMinVec = tVec; fMinTotalR = fTotalR; } } //如果mMinObs不是null就轉向 if (mMinObs != null) { float fForwardForce = fMinDot; float fTurnForce = fMinTotalR/(fSinLen+0.01f); float fSign = fTurnForce * 0.1f; Vector3 vTurn = Vector3.Cross (cFor, tMinVec); if (vTurn.y > 0) { fSign = -fTurnForce * 0.1f; } if (data.frotate * fSign < 0) { data.frotate = 0.0f; } data.frotate += fSign * 0.1f; if (data.frotate < 0.0f) { if (data.frotate < -data.fMaxrotate) { data.frotate = -data.fMaxrotate; } } if (data.frotate > 0.0f) { if (data.frotate > data.fMaxrotate) { data.frotate = data.fMaxrotate; } } float fBigForce = 1.0f; data.fInTrapTime += Time.deltaTime; if(data.fInTrapTime > 1.0f) { fBigForce += data.fInTrapTime*20.0f; data.frotate = fSign; } go.transform.Rotate (0.0f, data.frotate*fBigForce, 0.0f); data.fspeed -= fForwardForce; if(data.fspeed < 0.0f){ data.fspeed = 0.0f; } return true; } data.fInTrapTime = 0.0f; return false; }
//因為是複寫的,所以是override public override void CheckState (AIData data){ //尋找目標 fDist = 10000.0f; iSlotFSM = -1; data.targetPoint = AIBehavior.CheckPlayer (data, out fDist, out iSlotFSM); if (data.targetPoint != null) { Debug.Log ("有目標"); data.targetPosition = data.targetPoint.transform.position; //if (fDist < data.fDetectLength) { //距離小於可視範圍 // data.m_State.PerformTransition (eTransitionID.Track_To_Chase, data); //} else if (fDist < data.fAttackLength) { //距離小於攻擊範圍 if (data.fMP > data.fSkillMP) { //=============================技能進入機率============================= iRandom = Random.Range (1, 2); if (iRandom == 2) { //=============================完============================= data.m_State.PerformTransition (eTransitionID.Track_To_Attack, data); } else { data.m_State.PerformTransition (eTransitionID.Track_To_Skill, data); } } else{ data.m_State.PerformTransition (eTransitionID.Track_To_Attack, data); } } } }
public static bool OBSWall(GameObject go, AIData data, out Vector3 vForward){ Wall [] obsWall = data.m_Wall; int iLength = obsWall.Length; Vector3 tPos; Vector3 tVec; Vector3 cPos = go.transform.position; Vector3 cFor = go.transform.forward; float fDist = 0.0f;; float fTotalR = 0.0f; float fDot; float fTheta; float fSinLen = 0.0f; Wall mMinObs = null; float fMinDist = 10000.0f; //設一個值用來比較目前最小距離 for (int i=0; i<iLength; i++) { tPos = obsWall [i].transform.position; tVec = tPos - cPos; fDist = tVec.magnitude; fTotalR = data.fRadius + obsWall [i].fWallColProbe; //兩者距離>探針長度+兩者的radius,跳過 if (fDist > data.fColProbe + fTotalR) { continue; } //Dot<0,在背面,跳過 tVec.Normalize (); fDot = Vector3.Dot (cFor, tVec); if (fDot < 0.01f) { continue; } else if (fDot > 1.0f) { fDot = 1.0f; } //sin距離>兩者的radius,跳過 fTheta = Mathf.Acos(fDot); fSinLen = fDist*Mathf.Sin(fTheta); if(fSinLen > fTotalR){ continue; } if(fDist < fMinDist){ mMinObs = obsWall[i]; fMinDist = fDist; } } //如果mMinObs不是null就轉向 if (mMinObs != null) { vForward = mMinObs.transform.forward; return true; } vForward = Vector3.zero; return false; }
//敵人尋找目前玩家目標 public static GameObject CheckPlayer(AIData data, out float fOutMinDist, out int ioutSlotAI){ //(裡面回傳距離,判定距離過小時直接進行攻擊等等) GameObject [] gos = SceneManager.m_Instance.m_EnemyTarget; Vector3 tPos; Vector3 tVec; float fDist = 0.0f; float fMinDist = 10000.0f; GameObject go = null; //int iTarget = -1; bool bUsing = false; ioutSlotAI = -1; int iLength = SceneManager.m_Instance.m_EnemyTarget.Length; for (int i=0; i<iLength; i++) { tPos = gos [i].transform.position; tVec = tPos - data.thisPoint.gameObject.transform.position; fDist = tVec.magnitude; bUsing = ObjectPool.m_Instance.FindObjectToPool (out ioutSlotAI, gos [i].gameObject); //bUsing = ObjectPool.m_Instance.FindObjectToPool(i, gos[i].gameObject); Debug.Log ("啟用=" + bUsing); if (fDist < fMinDist && bUsing == true) { Debug.Log ("找到目標"); //iTarget = i; fMinDist = fDist; go = gos [i]; } } //ioutTarget = iTarget; fOutMinDist = fMinDist; return go; }
public static void Attack(AIData data){ data.targetAIData.fHP -= data.fAttack; }
public override void DoState (AIData data){ Debug.Log (data.thisPoint+"目前狀態:" + m_StateID); fTime += Time.deltaTime; }
public static bool Seek(GameObject go, AIData data){ Vector3 tPos = data.targetPosition; Vector3 cPos = go.transform.position; Vector3 cFor = go.transform.forward; Vector3 tVec = tPos - cPos; tVec.y = 0; float dist = tVec.magnitude; if (dist <= data.fspeed * Time.deltaTime) { go.transform.position = tPos; data.fspeed = 0.0f; return false; } data.fspeed += 0.1f; if (data.fspeed > data.fMaxspeed) { data.fspeed = data.fMaxspeed; } else if (data.fspeed < 0.1f) { data.fspeed = 0.1f; } //go.transform.position += cFor * data.fspeed * Time.deltaTime; tVec.Normalize (); go.transform.forward = tVec; float fDot = Vector3.Dot (tVec, cFor); if (fDot < -1.0f) { fDot = -1.0f; } else if (fDot > 1.0f) { fDot = 1.0f; } float fTheta = Mathf.Acos (fDot); float fTurnForce = Mathf.Sin (fTheta); float fDegree = fTurnForce * Mathf.Rad2Deg; if (fDegree <= data.fMaxrotate) { go.transform.forward = tVec; } else { float fSign = fTurnForce; Vector3 vTurn = Vector3.Cross (cFor, tVec); if (vTurn.y < 0) { fSign = -fTurnForce; } if (data.frotate * fSign < 0) { data.frotate = 0.0f; } data.frotate += fSign * 0.1f; if (data.frotate < 0.0f) { if (data.frotate < -data.fMaxrotate) { data.frotate = -data.fMaxrotate; } } if (data.frotate > 0.0f) { if (data.frotate > data.fMaxrotate) { data.frotate = data.fMaxrotate; } } go.transform.Rotate (0.0f, data.frotate, 0.0f); } //如果有撞到東西,保持原本的forward if (AIBehavior.OBS (go, data, true)) { go.transform.forward = cFor; } return true; }
public override void DoBeforeEnter (AIData data){ data.targetPoint = null; fTime = 0.0f; fIdleTime = 1.0f; }
//因為是複寫的,所以是override public override void CheckState (AIData data){ fDist = 10000.0f; iSlotFSM = -1; data.targetPoint = AIBehavior.CheckPlayer (data, out fDist, out iSlotFSM); Debug.Log ("==========================目前距離:"+fDist); if (data.targetPoint != null) { //m_AIData.targetAIData = m_AIData.targetPoint; if (fDist >= data.fAttackLength) { //如果距離大於攻擊範圍,切到追逐狀態 data.m_State.PerformTransition (eTransitionID.Skill_To_Track, data); } } else{ //回到Idel狀態 data.m_State.PerformTransition (eTransitionID.Skill_To_Idle, data); } }
public override void DoBeforeEnter (AIData data) { data.targetPosition.x = Random.Range (-20.0f, 20.0f); data.targetPosition.y = 1.0f; data.targetPosition.z = Random.Range (-20.0f, 20.0f); }
public override void DoState (AIData data){ Debug.Log (data.thisPoint + "目前狀態:" + m_StateID); //取出Component m_pGameObject = data.targetPoint; pComponent = m_pGameObject.GetComponent<Player> (); //完 //=============================測試用============================= if (fScale < fScaleMax) { data.thisPoint.transform.localScale += new Vector3 (1.0f, 1.0f, 1.0f) * Time.deltaTime; } else { data.thisPoint.transform.localScale -= new Vector3 (1.0f, 1.0f, 1.0f) * Time.deltaTime; if (data.thisPoint.transform.localScale.x <= 5.0f){ fScale = 0.0f; } } fScale += Time.deltaTime; //=============================完============================= if (fTime > fSkillTime) { pComponent.m_AIData.fHP -= data.fSkill; data.fMP -= data.fSkillMP; //============================攻擊紀錄============================ //Debug.Log (data.thisPoint + "===技能攻擊擊中===" + m_pGameObject); //Debug.Log (m_pGameObject + "===被技能攻擊===" + data.fSkill + "===擊中後的血量===" + pComponent.m_AIData.fHP); //=============================完============================= //=============================防呆============================= if (pComponent.m_AIData.fHP <= 0) { pComponent.m_AIData.fHP = 0; } //=============================完============================= //Debug.Log (pComponent.m_AIData.fHP); if (pComponent.m_AIData.fHP == 0.0f) { Debug.Log (data.thisPoint + "===攻擊目標===" + data.targetPoint.gameObject + "===死亡==="); ObjectPool.m_Instance.UnLoadObjectToPool (out iSlotFSM, data.targetPoint.gameObject); data.m_State.PerformTransition (eTransitionID.Skill_To_Idle, data); } //=============================測試用============================= data.thisPoint.GetComponent<Renderer> ().material.color = Color.white; //=============================完============================= data.m_State.PerformTransition (eTransitionID.Skill_To_Idle, data); } fTime += Time.deltaTime; }