void ClickHandler(Vector2 pos) { Ray ray = Camera.main.ScreenPointToRay(pos); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { if (hit.transform.tag == "PlayerField") { if (currentPlayerEnergy > player.energyCost) { currentPlayerEnergy -= player.energyCost; if (player.isAtk) { GameObject soldierObjPlayer = Instantiate(soldierAtkPrefab, hit.point, Quaternion.identity, gameplayComponents.transform); SoldierAtk s = soldierObjPlayer.GetComponent <SoldierAtk>(); s.ball = ballObj; s.Soldier.SetAttr(true); s.Soldier.GameManager = this; AtkSoldiers.Add(s); } else { GameObject soldierObj = Instantiate(soldierDefPrefab, hit.point, Quaternion.identity, gameplayComponents.transform); SoldierDef s = soldierObj.GetComponent <SoldierDef>(); s.Soldier.SetAttr(true); s.Soldier.GameManager = this; DefSoldiers.Add(s); } } } else if (hit.transform.tag == "EnemyField") { if (currentEnemyEnergy > enemy.energyCost) { currentEnemyEnergy -= enemy.energyCost; if (enemy.isAtk) { GameObject soldierObjEnemy = Instantiate(soldierAtkPrefab, hit.point, Quaternion.Euler(0, 180, 0), gameplayComponents.transform); SoldierAtk s = soldierObjEnemy.GetComponent <SoldierAtk>(); s.ball = ballObj; s.Soldier.SetAttr(false); s.Soldier.GameManager = this; AtkSoldiers.Add(s); } else { GameObject soldierObjEnemy = Instantiate(soldierDefPrefab, hit.point, Quaternion.Euler(0, 180, 0), gameplayComponents.transform); SoldierDef s = soldierObjEnemy.GetComponent <SoldierDef>(); s.Soldier.SetAttr(false); s.Soldier.GameManager = this; DefSoldiers.Add(s); } } } } }
void Update() { if (Globals.gamePaused) { Soldier.animator.SetBool("Run", false); return; } if (Soldier.isActive) { // if detect atker: chase if (target != null) { Soldier.animator.SetBool("Run", true); transform.position = Vector3.MoveTowards(transform.position, target.transform.position, Params.speedNormalMultiplierDef * Time.deltaTime); // while chasing: hide the DetectionArea DetectionArea.SetActive(false); // if caught the Atker if (targetCaught) { Soldier.animator.SetBool("Run", false); Soldier.SetStatus(false); Soldier.SetKinematic(true); StartCoroutine(Reactivate()); } else { // If other Defers caught the Atker target while chasing, return // to the origin position and let any Soldiers pass through // This sounds unreal, but matches the fact that // *The Detection circle is only available at Standby state* if (target.isCaught) { Soldier.SetStatus(false); Soldier.SetKinematic(true); returning = true; } } } } if (returning) { Soldier.animator.SetBool("Run", true); transform.position = Vector3.MoveTowards(transform.position, Soldier.originPos, Params.speedReturnMultiplier * Time.deltaTime); if (transform.position == Soldier.originPos) { Soldier.animator.SetBool("Run", false); returning = false; target = null; Soldier.SetStatus(true); Soldier.SetKinematic(false); DetectionArea.SetActive(true); } } }
void OnTriggerEnter(Collider other) { if (other.tag == "SoldierAtk") { SoldierAtk soldier = other.transform.parent.GetComponent <SoldierAtk>(); if (GameManager.ballHolder == soldier.Soldier) { soldierDef.target = soldier; } } }
void OnCollisionEnter(Collision collision) { if (gameObject.tag == "SoldierDef" && collision.gameObject.tag == "SoldierAtk") { SoldierDef soldierDef = transform.parent.GetComponent <SoldierDef>(); SoldierAtk soldierAtk = collision.transform.parent.GetComponent <SoldierAtk>(); if (transform.parent.GetComponent <SoldierDef>().target == soldierAtk) { soldierDef.targetCaught = true; soldierAtk.isCaught = true; } } }
void Update() { if (Globals.gamePaused) { Soldier.animator.SetBool("Run", false); return; } if (Soldier.isActive) { if (target != null) { Soldier.animator.SetBool("Run", true); transform.position = Vector3.MoveTowards(transform.position, target.transform.position, Params.speedNormalMultiplierDef * Time.deltaTime); DetectionArea.SetActive(false); if (targetCaught) { Soldier.animator.SetBool("Run", false); Soldier.SetStatus(false); Soldier.SetKinematic(true); StartCoroutine(Reactivate()); } else { if (target.isCaught) { Soldier.SetStatus(false); Soldier.SetKinematic(true); returning = true; } } } } if (returning) { Soldier.animator.SetBool("Run", true); transform.position = Vector3.MoveTowards(transform.position, Soldier.originPos, Params.speedReturnMultiplier * Time.deltaTime); if (transform.position == Soldier.originPos) { Soldier.animator.SetBool("Run", false); returning = false; target = null; Soldier.SetStatus(true); Soldier.SetKinematic(false); DetectionArea.SetActive(true); } } }
void Update() { if (Globals.gamePaused) { return; } if (transform.parent == null && passedTo != null) { transform.position = Vector3.MoveTowards(transform.position, passedTo.transform.position, moveSpeed * Time.deltaTime); if (transform.position == passedTo.transform.position) { passedTo = null; } } }
SoldierAtk GetNearestAtker() { float minDistance = float.PositiveInfinity; SoldierAtk potentialAtker = null; foreach (SoldierAtk soldierAtk in GameManager.AtkSoldiers) { if (!soldierAtk.Soldier.isActive || soldierAtk == this) { continue; } float distance = Vector3.Distance(soldierAtk.transform.position, transform.position); if (distance < minDistance) { potentialAtker = soldierAtk; minDistance = distance; } } return(potentialAtker); }
void Update() { if (Globals.gamePaused) { Soldier.animator.SetBool("Run", false); return; } if (Soldier.isActive) { Soldier.animator.SetBool("Run", true); if (GameManager.ballHolder == null) { Soldier.animator.speed = 1; CircleIndicator.SetActive(false); Soldier.SetKinematic(true); transform.position = Vector3.MoveTowards(transform.position, ball.transform.position, Params.speedNormalMultiplierAtk * Time.deltaTime); if (Vector3.Distance(transform.position, ball.transform.position) <= Params.spacingBallAtk) { GameManager.ballHolder = Soldier; ball.transform.parent = Soldier.transform.parent; } } else if (GameManager.ballHolder == Soldier) { Soldier.animator.speed = Params.speedCarryMultiplier / Params.speedNormalMultiplierAtk; CircleIndicator.SetActive(true); if (isCaught) { CircleIndicator.SetActive(false); SoldierAtk nearestAtker = GetNearestAtker(); if (nearestAtker == null) { GameManager.MatchOver(false); Soldier.SetStatus(false); return; } Vector3 targetDirection = nearestAtker.transform.position - transform.position; Vector3 newDirection = Vector3.RotateTowards(transform.forward, targetDirection, 360, 0f); transform.rotation = Quaternion.LookRotation(newDirection); Soldier.animator.SetBool("Pass", true); Soldier.animator.SetBool("Run", false); Soldier.animator.SetBool("Pass", false); GameManager.ballHolder = null; Soldier.SetStatus(false); Soldier.SetKinematic(true); ball.transform.parent = null; ball.GetComponent <Ball>().passedTo = nearestAtker; StartCoroutine(Reactivate()); } else { Soldier.animator.speed = 1; Soldier.SetKinematic(false); transform.position = Vector3.MoveTowards(transform.position, gatePos, Params.speedCarryMultiplier * Time.deltaTime); } } else { Soldier.animator.speed = 1; CircleIndicator.SetActive(false); Soldier.SetKinematic(true); transform.position = Vector3.MoveTowards(transform.position, new Vector3(transform.position.x, gatePos.y, gatePos.z), Params.speedNormalMultiplierAtk * Time.deltaTime); if (transform.position.z == gatePos.z) { GameManager.AtkSoldiers.Remove(this); Soldier.animator.SetBool("Down", true); Soldier.SetStatus(false); Destroy(gameObject, 1.2f); } } } }
void Update() { if (Globals.gamePaused) { Soldier.animator.SetBool("Run", false); return; } if (Soldier.isActive) { Soldier.animator.SetBool("Run", true); // chase the ball if it's not hold by an Attacker if (GameManager.ballHolder == null) { Soldier.animator.speed = 1; CircleIndicator.SetActive(false); Soldier.SetKinematic(true); transform.position = Vector3.MoveTowards(transform.position, ball.transform.position, Params.speedNormalMultiplierAtk * Time.deltaTime); // there should be an *acceptable range* that allows Atker // to *catch* the ball if it's in the range if (Vector3.Distance(transform.position, ball.transform.position) <= Params.spacingBallAtk) { GameManager.ballHolder = Soldier; ball.transform.parent = Soldier.transform.parent; } } // if holding the ball else if (GameManager.ballHolder == Soldier) { Soldier.animator.speed = Params.speedCarryMultiplier / Params.speedNormalMultiplierAtk; CircleIndicator.SetActive(true); // if caught: find nearest Atker, pass the ball, become inactive // if no nearest Atker available, game over if (isCaught) { CircleIndicator.SetActive(false); //Debug.Log($"Caught by Defender at {transform.position}"); SoldierAtk nearestAtker = GetNearestAtker(); // if (nearestAtker == null) { GameManager.MatchOver(false); Soldier.SetStatus(false); return; } // rotate to the nearest Atker & pass the ball Vector3 targetDirection = nearestAtker.transform.position - transform.position; Vector3 newDirection = Vector3.RotateTowards(transform.forward, targetDirection, 360, 0f); transform.rotation = Quaternion.LookRotation(newDirection); Soldier.animator.SetBool("Pass", true); Soldier.animator.SetBool("Run", false); Soldier.animator.SetBool("Pass", false); GameManager.ballHolder = null; //Debug.Log($"Nearest Attacker at {nearestAtker.transform.position}"); Soldier.SetStatus(false); Soldier.SetKinematic(true); ball.transform.parent = null; ball.GetComponent <Ball>().passedTo = nearestAtker; StartCoroutine(Reactivate()); } else { Soldier.animator.speed = 1; Soldier.SetKinematic(false); transform.position = Vector3.MoveTowards(transform.position, gatePos, Params.speedCarryMultiplier * Time.deltaTime); } } // If no ball to chase or hold, move towards the opponent's fence // and destroy on collision // Using *kinematic* allows SoldierAtk to *pass through* others, // but it can't collide with fences (except for changing // project collision settings - but that may cause some // unexpected results - idk, not enough time to test xD) // So the simpler approach is to compare current position // with the Gate's z-position. If equal => Destroy else { Soldier.animator.speed = 1; CircleIndicator.SetActive(false); Soldier.SetKinematic(true); transform.position = Vector3.MoveTowards(transform.position, new Vector3(transform.position.x, gatePos.y, gatePos.z), Params.speedNormalMultiplierAtk * Time.deltaTime); if (transform.position.z == gatePos.z) { GameManager.AtkSoldiers.Remove(this); // This animation needs a bit *tweaking* Soldier.animator.SetBool("Down", true); Soldier.SetStatus(false); Destroy(gameObject, 1.2f); } } } }
void ClickHandler(Vector2 pos) { // 2D screen => 3d world space Ray ray = Camera.main.ScreenPointToRay(pos); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { //OnscreenDebugOutput.Log($"Touch at {pos}, hit {hit.transform.tag} at {hit.point}"); if (hit.transform.tag == "PlayerField") { if (currentPlayerEnergy > player.energyCost) { currentPlayerEnergy -= player.energyCost; if (player.isAtk) { GameObject soldierObjPlayer = Instantiate(soldierAtkPrefab, hit.point, Quaternion.identity, gameplayComponents.transform); SoldierAtk s = soldierObjPlayer.GetComponent <SoldierAtk>(); s.ball = ballObj; s.Soldier.SetAttr(true); s.Soldier.GameManager = this; AtkSoldiers.Add(s); //OnscreenDebugOutput.Log($"Added {s} at {hit.point}"); } else { GameObject soldierObj = Instantiate(soldierDefPrefab, hit.point, Quaternion.identity, gameplayComponents.transform); SoldierDef s = soldierObj.GetComponent <SoldierDef>(); s.Soldier.SetAttr(true); s.Soldier.GameManager = this; DefSoldiers.Add(s); //OnscreenDebugOutput.Log($"Added {s} at {hit.point}"); } } } // TODO: remove this pls // Replace with a simple *Do nothing* // or a message to let the player know that // they can't put soldiers in enemy's field. // Or only activate this in 2-players mode else if (hit.transform.tag == "EnemyField") { if (currentEnemyEnergy > enemy.energyCost) { currentEnemyEnergy -= enemy.energyCost; if (enemy.isAtk) { GameObject soldierObjEnemy = Instantiate(soldierAtkPrefab, hit.point, Quaternion.Euler(0, 180, 0), gameplayComponents.transform); SoldierAtk s = soldierObjEnemy.GetComponent <SoldierAtk>(); s.ball = ballObj; s.Soldier.SetAttr(false); s.Soldier.GameManager = this; AtkSoldiers.Add(s); } else { GameObject soldierObjEnemy = Instantiate(soldierDefPrefab, hit.point, Quaternion.Euler(0, 180, 0), gameplayComponents.transform); SoldierDef s = soldierObjEnemy.GetComponent <SoldierDef>(); s.Soldier.SetAttr(false); s.Soldier.GameManager = this; DefSoldiers.Add(s); } } } } }