public void ComputeNeighbors() { Vector3 f1 = transform.position; Vector3 direction = new Vector3(Mathf.Cos(GlobalVariables.windDirection), 0, Mathf.Sin(GlobalVariables.windDirection)); float focalDist = GlobalVariables.windPower * GlobalVariables.minRadiusFire / 25; Vector3 f2 = f1 + (direction * focalDist); maxDistance = focalDist + GlobalVariables.minRadiusFire; // modification de la distance max //Tableau contenant les colliders proches Collider[] closeColliders = Physics.OverlapSphere(transform.position, maxDistance); //Pour chacun d'entre eux foreach (Collider closeCollider in closeColliders) { //Recuperer le composant inflammable Inflammable closeInflammable = closeCollider.GetComponentInParent <Inflammable>(); if (closeInflammable != null && closeInflammable != this) //si non nul et non this { if (((f1 - closeInflammable.transform.position).magnitude + (f2 - closeInflammable.transform.position).magnitude) <= maxDistance) // s'il se trouve dans l'ellipse { AddCloseTree(closeInflammable); } Vector3 of1 = closeInflammable.transform.position; Vector3 of2 = of1 + (direction * focalDist); if (((of1 - transform.position).magnitude + (of2 - transform.position).magnitude) <= maxDistance) { closeInflammable.AddCloseTree(this); } } } }
public void AddCloseTree(Inflammable closeTree) { if (!closeTrees.Contains(closeTree)) { closeTrees.Add(closeTree); } }
void FightFire(Inflammable burningTree) { WaterStreamFX.transform.localEulerAngles = new Vector3(0, 0, -90); myTree = burningTree; Vector3 treePosition = burningTree.transform.position; isFighting = true; isMoving = false; WaterStreamFX.SetActive(true); WaterStreamFX.GetComponentInChildren <EllipsoidParticleEmitter>().emit = true; //orienter le jet d'eau vers l'arbre le plus proche float myAngle = Vector3.Angle(transform.right, treePosition - transform.position); if (Vector3.Cross(transform.right, treePosition - transform.position).y < 0) { myAngle = -myAngle; } WaterStreamFX.transform.Rotate(new Vector3(0, 0, myAngle)); //Vector3 myCenter = transform.TransformPoint(WaterStreamFX.GetComponent<SphereCollider>().center); Vector3 myCenter = WaterStreamFX.GetComponentInChildren <SphereCollider>().transform.position; foreach (Collider collider in Physics.OverlapSphere(myCenter, 7f)) { if (collider.transform.parent != null) { if (collider.transform.parent.tag == "Tree") { collider.GetComponentInParent <Inflammable>().Watered(); } } } }
public void StartFire() { bool fireStarted = false; Collider[] closeColliders = Physics.OverlapSphere(transform.position, Radius); foreach (Collider closeCollider in closeColliders) { Inflammable closeInflammable = closeCollider.GetComponentInParent <Inflammable>(); //Si il n'est pas inflammable, passe if (closeInflammable == null) { continue; } closeInflammable.Ignite(); fireStarted = true; GlobalVariables.SetFirePoint(transform.position); } if (fireStarted) { //this.transform.position = Vector3.zero; //gameObject.SetActive(false); GetComponent <Renderer>().materials[0].color = new Color(0, 0, 1, 0.267f); Radius = 2; Resize(); GlobalVariables.NextState(); if (grapher != null) { grapher.launch(); } } }
//Reçoit le feu de son voisin public void PassFire(Inflammable foreignTree) { if (isBurnt) { return; } bool b = IsBurning(); float foreignFire = foreignTree.GetComponent <Inflammable>().fireValue; float distance = Vector3.Distance(gameObject.transform.position, foreignTree.transform.position); fireValue += (foreignFire * 0.00005f) * GlobalVariables.Speed * (maxDistance - distance) / maxDistance; fireValue = Mathf.Clamp(fireValue, 0f, 100f); if (IsBurning() && !b) { StartFire(); } }
void StopFighting() { isFighting = false; myTree = null; WaterStreamFX.GetComponentInChildren <EllipsoidParticleEmitter>().emit = false; }