public void SetPath(List <Chunk_Script> newPath) { if (newPath != path) { path = newPath; targetChunk = path[0]; endChunk = newPath[newPath.Count - 1]; } }
void FixedUpdate() { Ray ray = new Ray(this.transform.position, -this.transform.up); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { if (hit.collider.CompareTag("Chunk")) { currentChunk = hit.collider.gameObject.GetComponent <Chunk_Script>(); } } }
private Chunk_Script GetLowestFCost(List <Chunk_Script> chunkList) { Chunk_Script lowestFCostChunk = chunkList[0]; foreach (Chunk_Script cs in chunkList) { if (cs.fCost < lowestFCostChunk.fCost) { lowestFCostChunk = cs; } } return(lowestFCostChunk); }
private List <Chunk_Script> GetNeighbourList(Chunk_Script currentChunk) { List <Chunk_Script> neightbourList = new List <Chunk_Script>(); if (currentChunk.positionX - 1 >= -grid.width / 2) { neightbourList.Add(GetChunk(currentChunk.positionX - 1, currentChunk.positionZ)); if (currentChunk.positionZ - 1 >= -grid.height / 2) { neightbourList.Add(GetChunk(currentChunk.positionX - 1, currentChunk.positionZ - 1)); } if (currentChunk.positionZ + 1 < grid.height / 2) { neightbourList.Add(GetChunk(currentChunk.positionX - 1, currentChunk.positionZ + 1)); } } if (currentChunk.positionX + 1 >= -grid.width / 2) { neightbourList.Add(GetChunk(currentChunk.positionX + 1, currentChunk.positionZ)); if (currentChunk.positionZ - 1 >= -grid.height / 2) { neightbourList.Add(GetChunk(currentChunk.positionX + 1, currentChunk.positionZ - 1)); } if (currentChunk.positionZ + 1 < grid.height / 2) { neightbourList.Add(GetChunk(currentChunk.positionX + 1, currentChunk.positionZ + 1)); } } if (currentChunk.positionZ - 1 >= -grid.height / 2) { neightbourList.Add(GetChunk(currentChunk.positionX, currentChunk.positionZ - 1)); } if (currentChunk.positionZ + 1 < grid.height / 2) { neightbourList.Add(GetChunk(currentChunk.positionX, currentChunk.positionZ + 1)); } if (neightbourList.Count > 0) { return(neightbourList); } else { return(null); } }
public Chunk_Script GetChunkUnder() { Chunk_Script under = null; RaycastHit hit; if (Physics.Raycast(transform.position, -transform.up, out hit, 5)) { if (hit.collider.tag == "Chunk") { under = hit.collider.gameObject.GetComponent <Chunk_Script>(); } } return(under); }
public List <Chunk_Script> CalculatePath(Chunk_Script endChunk) { List <Chunk_Script> path = new List <Chunk_Script>(); path.Add(endChunk); Chunk_Script currentChunk = endChunk; while (currentChunk.fromChunk != null) { path.Add(currentChunk.fromChunk); currentChunk = currentChunk.fromChunk; } path.Reverse(); return(path); }
public int CalculateDistanceCost(Chunk_Script a, Chunk_Script b) { int cost = 0; if (a == null || b == null) { Debug.Log("Null a or b"); } int xDistance = Mathf.Abs(a.positionX - b.positionX); int zDistance = Mathf.Abs(a.positionZ - b.positionZ); int remaining = Mathf.Abs(xDistance - zDistance); cost = M_Diagonal_Cost * Mathf.Min(xDistance, zDistance) + M_Straight_Cost * remaining; return(cost); }
// Update is called once per frame void Update() { if (currentHealth < maxHealth) { healthBar.SetActive(true); } if (currentHealth > maxHealth) { currentHealth = maxHealth; } if (targetChunk != null) { if (currentChunk != endChunk) { if (this.transform.position.x <= targetChunk.positionX + 0.1f && this.transform.position.x > targetChunk.positionX - 0.1f && this.transform.position.z <= targetChunk.positionZ + 0.1f && this.transform.position.z > targetChunk.positionZ - 0.1f) { // Change target chunk to next chunk in path list int currentIndex = path.IndexOf(targetChunk); if (currentIndex + 1 < path.Count) { targetChunk = path[currentIndex + 1]; } } else if (this.transform.position.x <= targetChunk.positionX + 0.1f && this.transform.position.x > targetChunk.positionX - 0.1f) { // Move towards z centre of target chunk transform.position = Vector3.MoveTowards(this.transform.position, targetChunk.transform.position, speed * Time.deltaTime); Vector3 direction = (targetChunk.transform.position - transform.position).normalized; Quaternion lookRotation = Quaternion.LookRotation(direction); transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, speed * Time.deltaTime); } else if (this.transform.position.z <= targetChunk.positionZ + 0.1f && this.transform.position.z > targetChunk.positionZ - 0.1f) { // Move towards x centre of target chunk transform.position = Vector3.MoveTowards(this.transform.position, targetChunk.transform.position, speed * Time.deltaTime); Vector3 direction = (targetChunk.transform.position - transform.position).normalized; Quaternion lookRotation = Quaternion.LookRotation(direction); transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, speed * Time.deltaTime); } else { // Move towards centre of target chunk transform.position = Vector3.MoveTowards(this.transform.position, targetChunk.transform.position, speed * Time.deltaTime); Vector3 direction = (targetChunk.transform.position - transform.position).normalized; Quaternion lookRotation = Quaternion.LookRotation(direction); transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, speed * Time.deltaTime); } } else if (this.transform.position.x != endChunk.positionX || this.transform.position.z != endChunk.positionZ) { //Move towards endChunk centre transform.position = Vector3.MoveTowards(this.transform.position, targetChunk.transform.position, speed * Time.deltaTime); Vector3 direction = (targetChunk.transform.position - transform.position).normalized; Quaternion lookRotation = Quaternion.LookRotation(direction); transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, speed * Time.deltaTime); } //Do Nothing - turn off calculations? else { targetChunk = null; if (animManager.anim.GetBool("Running") == true) { animManager.Run(false); GetComponent <AudioSource>().Stop(); } if (actions > 0 && turnScript.currentTeam == 0) { aiScript.DistanceTemplate(); turnScript.CheckVisibleEnemies(); } else if (actions > 0 && turnScript.currentTeam == 1) { aiScript.behaviourScript.TakeAction(aiScript.aiEntity.GetComponent <AI_Follower_Script>()); } else if (GetActions() == 0) { turnScript.currentTeam = team; aiScript.aiEntity.GetComponent <AI_Follower_Script>().weaponRange.SetActive(false); aiScript.aiEntity = turnScript.GetNextUnit().gameObject; if (turnScript.currentTeam == 0) { turnScript.CheckVisibleEnemies(); aiScript.DistanceTemplate(); turnScript.aiScript.cameraTrolley.transform.position = turnScript.aiScript.aiEntity.transform.position; aiScript.aiEntity.GetComponent <AI_Follower_Script>().weaponRange.SetActive(true); } else { aiScript.behaviourScript.TakeAction(aiScript.aiEntity.GetComponent <AI_Follower_Script>()); } } } } }
public void SetChunkUnder(Chunk_Script chunk) { chunkUnder = chunk; }
public Vector3 Shoot(GameObject target, GameObject shooter) { AI_Follower_Script shooterUnit = shooter.GetComponent <AI_Follower_Script>(); Vector3 newPos = new Vector3(0, 0, 0); shooterUnit.aiScript.unitCamera.GetComponent <AudioSource>().Play(); for (float i = 0; i < 2; i += 0.3f) { StartCoroutine(DelayedSpawn(i, shooterUnit)); } Vector3 up1 = new Vector3(0, 0.5f); RaycastHit[] hits; float distance = Vector3.Distance(shooter.transform.position, target.transform.position); bool shot = false; if (distance < shooterUnit.maxRange) { hits = Physics.RaycastAll(shooter.transform.position + up1, (target.transform.position - shooter.transform.position), distance); Vector3 lookDirection = target.transform.position; lookDirection.y = 0; shooter.transform.LookAt(lookDirection); foreach (RaycastHit h in hits) { if (h.collider.tag == "Tall Cover") { if (Vector3.Distance(shooter.transform.position, h.transform.position) <= 2 && target != h.collider.gameObject) { RaycastHit hit; shooter.transform.position += shooter.transform.right; Chunk_Script avoidChunk = shooter.GetComponent <AI_Follower_Script>().GetChunkUnder(); if (avoidChunk.impassable == false) { if (Physics.Raycast(shooter.transform.position + up1, shooter.transform.forward, out hit, 1.5f)) { if (hit.collider.tag == ("Tall Cover")) { Debug.Log("Attempted and hit cover still"); } else { ShootRound(target, shooter, shooter.transform.position); newPos = shooter.transform.position; Debug.Log("Attempted and didn't hit cover"); shooter.transform.position += -shooter.transform.right; break; } } else { ShootRound(target, shooter, shooter.transform.position); newPos = shooter.transform.position; Debug.Log("Attempted and didn't hit cover"); shooter.transform.position += -shooter.transform.right; break; } } shooter.transform.position += -shooter.transform.right; shooter.transform.position += -shooter.transform.right; avoidChunk = shooter.GetComponent <AI_Follower_Script>().GetChunkUnder(); if (avoidChunk.impassable == false) { if (Physics.Raycast(shooter.transform.position + up1, shooter.transform.forward, out hit, 1.5f)) { if (hit.collider.tag == ("Tall Cover")) { Debug.Log("Attempted and hit cover still"); Debug.Log("Hit Tall Cover"); shot = false; shooterUnit.aiScript.GetComponent <AudioSource>().Play(); StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject)); break; } else { ShootRound(target, shooter, shooter.transform.position); newPos = shooter.transform.position; Debug.Log("Attempted and didn't hit cover"); shooter.transform.position += shooter.transform.right; break; } } else { ShootRound(target, shooter, shooter.transform.position); newPos = shooter.transform.position; Debug.Log("Attempted and didn't hit cover"); shooter.transform.position += shooter.transform.right; break; } } } else { Debug.Log("Hit Tall Cover"); shooterUnit.aiScript.GetComponent <AudioSource>().Play(); StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject)); shot = false; newPos = shooterUnit.transform.position; break; } } else if (h.collider.tag == "Low Cover") { if (Vector3.Distance(target.transform.position, h.transform.position) <= 0.5) { Debug.Log("Hit Low Cover"); shooterUnit.aiScript.GetComponent <AudioSource>().Play(); StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject)); shot = false; newPos = shooterUnit.transform.position; break; } else if (Vector3.Distance(target.transform.position, h.transform.position) <= 1.5) { if (target.tag == "Good Guy" || target.tag == "Bad Guy") { Debug.Log("Hit Low Cover"); shooterUnit.aiScript.GetComponent <AudioSource>().Play(); StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject)); shot = false; newPos = shooterUnit.transform.position; break; } else if (distance - Vector3.Distance(shooter.transform.position, h.transform.position) <= 0.5 && target.tag == "Low Cover") { Debug.Log("Hit Low Cover"); shooterUnit.aiScript.GetComponent <AudioSource>().Play(); StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject)); shot = false; newPos = shooterUnit.transform.position; break; } else { Debug.Log("Went Over Low Cover"); } } else if (target.transform == h.collider.gameObject.transform) { Debug.Log("Hit Low Cover"); shooterUnit.aiScript.GetComponent <AudioSource>().Play(); StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject)); shot = false; newPos = shooterUnit.transform.position; break; } else { Debug.Log("Went Over Low Cover"); } } else if (h.collider.tag == "Good Guy") { if (shooter.tag == "Bad Guy") { if (target == h.collider.gameObject) { shot = true; damagedUnit = h.collider.gameObject.GetComponent <AI_Follower_Script>(); } } } else if (h.collider.tag == "Bad Guy") { if (shooter.tag == "Good Guy") { if (target == h.collider.gameObject) { shot = true; damagedUnit = h.collider.gameObject.GetComponent <AI_Follower_Script>(); } } } } } if (shot == true) { shooterUnit.DealDamage(damagedUnit); Debug.Log("Hit Unit"); newPos = shooterUnit.transform.position; } return(newPos); }
// Update is called once per frame void Update() { if (turnScript.currentTeam == 0) { if (Input.GetMouseButtonDown(1)) { if (selectedObject != null) { if (selectedObject.GetComponent <MeshRenderer>() != null) { selectedObject.GetComponent <MeshRenderer>().material = materialContainer.FindMaterial(selectedObject.tag); } selectedObject = null; } Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { if (aiEntity.GetComponent <AI_Follower_Script>().GetActions() > 0) { if (hit.collider.CompareTag("Chunk")) { SetGrid(); endChunk = hit.collider.gameObject.GetComponent <Chunk_Script>(); if (!endChunk.impassable && !endChunk.lowCover) { path = FindPath(endChunk.gameObject); if (path != null) { path = CalculatePath(endChunk); MoveUnit(path); cameraTrolley.transform.position = endChunk.transform.position; aiEntity.GetComponent <AI_Follower_Script>().TakeAction(1); if (aiEntity.GetComponent <AI_Follower_Script>().animManager.anim.GetBool("Running") == false) { aiEntity.GetComponent <AI_Follower_Script>().animManager.Run(true); aiEntity.GetComponent <AudioSource>().Play(); } if (selectedObject != null) { selectedObject.GetComponent <MeshRenderer>().material = materialContainer.FindMaterial(selectedObject.tag); } foreach (Chunk_Script cs in GetNeighbourList(endChunk)) { if (cs.lowCover) { aiEntity.GetComponent <AI_Follower_Script>().animManager.Crouch(true); aiEntity.GetComponent <AI_Follower_Script>().crouching = true; break; } else { aiEntity.GetComponent <AI_Follower_Script>().crouching = false; aiEntity.GetComponent <AI_Follower_Script>().animManager.Crouch(false); } } renderer.enabled = false; } } } else if (hit.collider.CompareTag("Tall Cover") || hit.collider.CompareTag("Low Cover")) { float distance = Vector3.Distance(hit.collider.gameObject.transform.position, aiEntity.transform.position); if (distance < aiEntity.GetComponent <AI_Follower_Script>().maxRange) { cameraTrolley.transform.position = hit.collider.gameObject.transform.position; if (selectedObject == null) { selectedObject = hit.collider.gameObject; selectedObject.GetComponent <MeshRenderer>().material = materialContainer.FindMaterial("Selected"); } else { selectedObject.GetComponent <MeshRenderer>().material = materialContainer.FindMaterial(selectedObject.tag); selectedObject = hit.collider.gameObject; selectedObject.GetComponent <MeshRenderer>().material = materialContainer.FindMaterial("Selected"); } Vector3[] positions = new Vector3[] { aiEntity.transform.position, selectedObject.transform.position }; renderer.SetPositions(positions); renderer.enabled = true; shooter.ShowButton(true); } } else if (hit.collider.CompareTag("Good Guy")) { if (aiEntity.GetComponent <AI_Follower_Script>().turnScript.currentTeam == 1) { float distance = Vector3.Distance(hit.collider.gameObject.transform.position, aiEntity.transform.position); if (distance < aiEntity.GetComponent <AI_Follower_Script>().maxRange) { cameraTrolley.transform.position = hit.collider.gameObject.transform.position; if (selectedObject == null) { selectedObject = hit.collider.gameObject; } else { selectedObject = hit.collider.gameObject; } Vector3[] positions = new Vector3[] { aiEntity.transform.position, selectedObject.transform.position }; renderer.SetPositions(positions); renderer.enabled = true; shooter.ShowButton(true); } } } else if (hit.collider.CompareTag("Bad Guy")) { if (aiEntity.GetComponent <AI_Follower_Script>().turnScript.currentTeam == 0) { float distance = Vector3.Distance(hit.collider.gameObject.transform.position, aiEntity.transform.position); if (distance < aiEntity.GetComponent <AI_Follower_Script>().maxRange) { cameraTrolley.transform.position = hit.collider.gameObject.transform.position; if (selectedObject == null) { selectedObject = hit.collider.gameObject; } else { selectedObject = hit.collider.gameObject; } Vector3[] positions = new Vector3[] { aiEntity.transform.position, selectedObject.transform.position }; renderer.SetPositions(positions); renderer.enabled = true; shooter.ShowButton(true); } } } else { selectedObject.GetComponent <MeshRenderer>().material = materialContainer.FindMaterial(selectedObject.tag); renderer.enabled = false; } } } } if (Input.GetMouseButtonDown(0)) { Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { if (hit.collider.CompareTag("Good Guy")) { if (turnScript.currentTeam == 0 && aiEntity.GetComponent <AI_Follower_Script>().GetActions() != 1) { aiEntity.GetComponent <AI_Follower_Script>().weaponRange.SetActive(false); aiEntity = hit.collider.gameObject; turnScript.CheckVisibleEnemies(); cameraTrolley.transform.position = aiEntity.transform.position; DistanceTemplate(); aiEntity.GetComponent <AI_Follower_Script>().weaponRange.SetActive(true); } else { cameraTrolley.transform.position = aiEntity.transform.position; aiEntity.GetComponent <AI_Follower_Script>().weaponRange.SetActive(true); } } else if (hit.collider.CompareTag("Bad Guy")) { if (turnScript.currentTeam == 1 && aiEntity.GetComponent <AI_Follower_Script>().GetActions() != 1) { aiEntity.GetComponent <AI_Follower_Script>().weaponRange.SetActive(false); aiEntity = hit.collider.gameObject; turnScript.CheckVisibleEnemies(); cameraTrolley.transform.position = aiEntity.transform.position; DistanceTemplate(); aiEntity.GetComponent <AI_Follower_Script>().weaponRange.SetActive(true); } else { cameraTrolley.transform.position = aiEntity.transform.position; aiEntity.GetComponent <AI_Follower_Script>().weaponRange.SetActive(true); } } else { if (selectedObject != null && (selectedObject.tag != "Bad Guy" && selectedObject.tag != "Good Guy")) { selectedObject.GetComponent <MeshRenderer>().material = materialContainer.FindMaterial(selectedObject.tag); } renderer.enabled = false; } } } } }
private List <Chunk_Script> FindTemplate() { Vector3 raycastPoint = new Vector3(0, 0.2f, 0); Ray ray = new Ray(aiEntity.transform.position + raycastPoint, -aiEntity.transform.up); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { if (hit.collider.CompareTag("Chunk")) { startChunk = hit.collider.gameObject.GetComponent <Chunk_Script>(); } } foreach (Chunk_Script cs in visibleTemplate) { cs.gameObject.GetComponentInChildren <MeshRenderer>().enabled = false; } openPath = new List <Chunk_Script>(); closedPath = new List <Chunk_Script>(); visibleTemplate = new List <Chunk_Script>(); openPath.Add(startChunk); startChunk.gCost = 0; startChunk.CalcFCost(); while (openPath.Count > 0) { Chunk_Script currentChunk = GetLowestFCost(openPath); openPath.Remove(currentChunk); closedPath.Add(currentChunk); foreach (Chunk_Script neighbour in GetNeighbourList(currentChunk)) { if (closedPath.Contains(neighbour)) { continue; } if (neighbour != null) { int tentativeGCost = currentChunk.gCost + CalculateDistanceCost(currentChunk, neighbour); if (tentativeGCost < neighbour.gCost && tentativeGCost <= aiEntity.GetComponent <AI_Follower_Script>().maxDistance) { if (!neighbour.impassable) { neighbour.fromChunk = currentChunk; neighbour.gCost = tentativeGCost; neighbour.CalcFCost(); if (!openPath.Contains(neighbour)) { openPath.Add(neighbour); visibleTemplate.Add(neighbour); neighbour.GetComponentInChildren <MeshRenderer>().enabled = true; } } } } } } return(null); }
public List <Chunk_Script> FindPathAI(GameObject endChunk, GameObject unit) { Vector3 raycastPoint = new Vector3(0, 0.2f, 0); Ray ray = new Ray(unit.transform.position + raycastPoint, -unit.transform.up); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { if (hit.collider.CompareTag("Chunk")) { startChunk = hit.collider.gameObject.GetComponent <Chunk_Script>(); } } openPath = new List <Chunk_Script>(); closedPath = new List <Chunk_Script>(); openPath.Add(startChunk); startChunk.gCost = 0; startChunk.hCost = CalculateDistanceCost(startChunk, endChunk.GetComponent <Chunk_Script>()); startChunk.CalcFCost(); while (openPath.Count > 0) { Chunk_Script currentChunk = GetLowestFCost(openPath); if (currentChunk == endChunk.GetComponent <Chunk_Script>()) { return(closedPath); } //else if(currentChunk.gCost >= unit.GetComponent<AI_Follower_Script>().maxDistance) //{ // closedPath.RemoveAt(closedPath.Count - 1); // return closedPath; //} openPath.Remove(currentChunk); closedPath.Add(currentChunk); foreach (Chunk_Script neighbour in GetNeighbourList(currentChunk)) { if (closedPath.Contains(neighbour)) { continue; } if (neighbour != null) { int tentativeGCost = currentChunk.gCost + CalculateDistanceCost(currentChunk, neighbour); if (tentativeGCost <= neighbour.gCost) { if (!neighbour.impassable) { neighbour.fromChunk = currentChunk; neighbour.gCost = tentativeGCost; neighbour.hCost = CalculateDistanceCost(neighbour, endChunk.GetComponent <Chunk_Script>()); neighbour.CalcFCost(); if (!openPath.Contains(neighbour)) { openPath.Add(neighbour); } } } } } } return(null); }