Exemplo n.º 1
0
 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);
 }
Exemplo n.º 2
0
    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();
    }
Exemplo n.º 5
0
    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;
    }
Exemplo n.º 6
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);
        }
Exemplo n.º 7
0
 // 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;
 }
Exemplo n.º 8
0
 internal override void PerformAI(AIData data)
 {
     try
     {
         this.Api.PerformAI(data);
     }
     catch (Exception ex)
     {
         base.LastException = ex;
         throw;
     }
 }
Exemplo n.º 9
0
 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);
     }
 }
Exemplo n.º 10
0
    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);
    }
Exemplo n.º 11
0
    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>();
        }
    }
Exemplo n.º 12
0
 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;
 }
Exemplo n.º 13
0
 /// <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);
 }
Exemplo n.º 14
0
    // 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>();
    }
Exemplo n.º 15
0
 internal override void PerformAI(AIData data)
 {
                 #if !DEBUG
     try {
                         #endif
     this.Api.PerformAI(data);
                         #if !DEBUG
 }
 catch (Exception ex) {
     base.LastException = ex;
     throw;
 }
                 #endif
 }
Exemplo n.º 16
0
    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);
            }
        }
    }
Exemplo n.º 17
0
 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");
 }
Exemplo n.º 18
0
	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);
             }
         }
     }
 }
Exemplo n.º 20
0
        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);
            }
        }
Exemplo n.º 21
0
    //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;
    }
Exemplo n.º 22
0
    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
    }
Exemplo n.º 23
0
    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);
    }
Exemplo n.º 24
0
    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();
    }
Exemplo n.º 25
0
 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();
    }
Exemplo n.º 27
0
    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);
    }
Exemplo n.º 28
0
        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];
                }
            }
        }
Exemplo n.º 29
0
        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);
            }
        }
Exemplo n.º 30
0
    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;
    }
Exemplo n.º 31
0
 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
 }
Exemplo n.º 32
0
	//因為是複寫的,所以是override
	public override void CheckState (AIData data){
		if (bArrival) {
			bArrival = false;
			data.m_State.PerformTransition (eTransitionID.Wander_To_Idle, data);
		}
	}
Exemplo n.º 33
0
	//做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;
			}
		}
	}
Exemplo n.º 34
0
	//因為是複寫的,所以是override
	public override void CheckState (AIData data){
		if(fTime > fIdleTime){
			data.m_State.PerformTransition(eTransitionID.Idle_To_Track, data);
		}
	}
Exemplo n.º 35
0
	public override void DoBeforeEnter (AIData data)
	{
		data.targetPoint = null;
		fTime = 0.0f;
		fTrackTime = 2.0f;
		data.iAstarIndex = -1;
	}
Exemplo n.º 36
0
 public void InitAI(int aiID)
 {
     self = GetComponent<Enemy>();
     data = DataManager.Instance.GetEnemyDataSet ().GetAIData (aiID);
 }
Exemplo n.º 37
0
	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);
	}
Exemplo n.º 38
0
	public override void DoBeforeLeave (AIData data){
		data.iAstarIndex = -1;
	}	
Exemplo n.º 39
0
	//virtual 關鍵字的用途是修改方法、屬性、索引子 (Indexer) 或事件宣告,以及允許在衍生類別 (Derived Class) 中予以覆寫。例如,這個方法可由任一繼承它的類別來覆寫
	//當離開State前要做什麼
	public virtual void DoBeforeEnter (AIData data){
		
	}
Exemplo n.º 40
0
	//做State
	public abstract void DoState (AIData data);
Exemplo n.º 41
0
	//現在這個Transition有沒有被達成是否該切換
	public abstract void CheckState (AIData data);
Exemplo n.º 42
0
	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;
	}
Exemplo n.º 43
0
	//因為是複寫的,所以是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);
			}*/
		}
	}
Exemplo n.º 44
0
	public override void DoBeforeEnter (AIData data){
		data.targetPoint = null;
	}
Exemplo n.º 45
0
	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);
	}
Exemplo n.º 46
0
	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;
	}
Exemplo n.º 47
0
	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;
	}
Exemplo n.º 48
0
	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;
	}
Exemplo n.º 49
0
    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
    }
Exemplo n.º 50
0
	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;
	}
Exemplo n.º 51
0
	//因為是複寫的,所以是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);
				}
			}
		}
	}
Exemplo n.º 52
0
	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;
	}
Exemplo n.º 53
0
	//敵人尋找目前玩家目標
	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;
	}
Exemplo n.º 54
0
	public static void Attack(AIData data){
		data.targetAIData.fHP -= data.fAttack;
	}
Exemplo n.º 55
0
	public override void DoState (AIData data){
		Debug.Log (data.thisPoint+"目前狀態:" + m_StateID);
		fTime += Time.deltaTime;
	}
Exemplo n.º 56
0
	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;
		
	}
Exemplo n.º 57
0
	public override void DoBeforeEnter (AIData data){
		data.targetPoint = null;
		fTime = 0.0f;
		fIdleTime = 1.0f;
	}
Exemplo n.º 58
0
	//因為是複寫的,所以是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);
		}
	}
Exemplo n.º 59
0
	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);
	}
Exemplo n.º 60
0
	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;
	}