using System.Collections.Generic; using UnityEngine; public class SceneBlock : MonoBehaviour { public GameObject firebasesAreaObj; public GameObject enemyContainerObj; public float group1InareaNum = 0; public float group2InareaNum = 0; public float belongRatio = 0; public float blockSize = 10f; public Vector3 firebasesAreaPosition; public float firebasesAreaScale; public float firebasesAreaDiameter; public enum SceneType { Go, Attack, Defence } public SceneType sceneType; public bool isDestroyed = false; // firebase state public string group1Tag = "Player"; public string group2Tag = "Enemy"; public float belongMaxPoint = 10f; public float firebasesBelong; // -10 mean's belon to group2Tag 10 = belon to group1Tag public float addPointInterval = 0.1f; // add point every addPointInterval scecond public float stayTimeNeeded = 5f; // howmany time to stay at area to get this area 0->10 private float addPointEachInterval; // add point in each interval private float intervalStart; private GameObject environmentObj; public GameObject[] group1Objs; public GameObject[] group2Objs; // Start is called before the first frame update private void Start() { // if firebasesAreaObj is null, find sub object by name if (firebasesAreaObj == null) { firebasesAreaObj = transform.Find("FirebasesArea").gameObject; } // if enemyContainerObj is null, find them by name if (enemyContainerObj == null) { enemyContainerObj = transform.Find("EnemyContainer").gameObject; } firebasesAreaPosition = transform.position + firebasesAreaObj.transform.position; firebasesAreaScale = firebasesAreaObj.transform.localScale.x; firebasesAreaDiameter = firebasesAreaScale * blockSize; firebasesBelong = -belongMaxPoint; addPointEachInterval = belongMaxPoint / (stayTimeNeeded / addPointInterval); intervalStart = Time.time; } // Update is called once per frame private void Update() { if (Time.time - intervalStart >= addPointInterval) { // update belong ratio every addPointInterval scecond group1InareaNum = GetInAreaNumber(group1Tag); group2InareaNum = GetInAreaNumber(group2Tag); belongRatio = group1InareaNum - group2InareaNum; if (belongRatio > 0) { // group 1 have the advantage! firebasesBelong += addPointEachInterval; if (firebasesBelong >= belongMaxPoint) { firebasesBelong = belongMaxPoint; } } else if (belongRatio < 0) { // group 2 have the advantage! firebasesBelong -= addPointEachInterval; if (firebasesBelong <= -belongMaxPoint) { firebasesBelong = -belongMaxPoint; } } intervalStart = Time.time; } } //Initialize this scene block should be excuted after enemy created public void InitBlock(GameObject envObj) { //Buffer all Player or enemy obj int this environment to list environmentObj = envObj; GameObject[] allGroup1Objs = GameObject.FindGameObjectsWithTag(group1Tag); GameObject[] allGroup2Objs = GameObject.FindGameObjectsWithTag(group2Tag); List group1ObjsList = new List(); List group2ObjsList = new List(); foreach (GameObject obj in allGroup1Objs) { if (obj.transform.root.gameObject == envObj && !obj.GetComponent().isDead) { group1ObjsList.Add(obj); } } foreach (GameObject obj in allGroup2Objs) { if (obj.transform.root.gameObject == envObj && !obj.GetComponent().isDead) { group2ObjsList.Add(obj); } } group1Objs = group1ObjsList.ToArray(); group2Objs = group2ObjsList.ToArray(); } //check game over 0=notover 1=win public int CheckOver() { return 0; } // get in area player number by tag public float GetInAreaNumber(string thisTag) { float inAreaNum = 0; float dist = 0f; float isInarea = 0f; int index = 0; if (thisTag == group1Tag) { foreach (GameObject obj in group1Objs) { // if object is dead then delete it from list if (obj == null) { // delete null object from list List group1ObjsList = new List(group1Objs); group1ObjsList.RemoveAt(index); group1Objs = group1ObjsList.ToArray(); } else { (dist, isInarea) = GetDistInArea(obj.transform.position); if (isInarea != 0f) { inAreaNum += 1; } } index++; } } else if (thisTag == group2Tag) { foreach (GameObject obj in group2Objs) { // if object is dead then delete it from list if (obj == null) { // delete null object from list List group2ObjsList = new List(group2Objs); group2ObjsList.RemoveAt(index); group2Objs = group2ObjsList.ToArray(); } else { (dist, isInarea) = GetDistInArea(obj.transform.position); if (isInarea != 0f) { inAreaNum += 1; } } index++; } } else { Debug.LogError("SceneBlock.getinAreaNumber:TagError"); } return inAreaNum; } // get this position and target's distance and is in firebase area public (float, int) GetDistInArea(Vector3 thisPosition) { thisPosition.y = firebasesAreaObj.transform.position.y; float dist = Vector3.Distance(thisPosition, firebasesAreaObj.transform.position) - (firebasesAreaDiameter / 2); int isinarea = 0; if (dist <= 0) { dist = 0f; isinarea = 1; } else { isinarea = 0; } return (dist, isinarea); } //destroy this block public void DestroyMe() { Destroy(this.gameObject); foreach (Transform childObj in enemyContainerObj.transform) { childObj.GetComponent().DestroyMe(); } isDestroyed = true; } }