private void Update() { const float distanceThreshold = 5; const float fuseIncrement = 1f / Fuse.FuseTicksPerSecond; const float fuseTimeMax = 10f; if (currentTarget == null) { return; // not active } if (!Input.GetMouseButton(0)) { currentTarget = null; return; // released LMB } // get mouse movement Vector3 newMousePos = Input.mousePosition; Vector3 mouseDelta = newMousePos - prevMousePos; float delta = mouseDelta.x + mouseDelta.y + mouseDelta.z; float distance = Mathf.Abs(delta); if (distance > distanceThreshold) { // calculate fuse time change int increments = Mathf.FloorToInt(distance / distanceThreshold); float change = increments * fuseIncrement * Mathf.Sign(delta); // update fuse float prevFuseTime = currentTarget.timeToDetonate; float newFuseTime = Mathf.Clamp(prevFuseTime + change, 0, fuseTimeMax); if (newFuseTime != prevFuseTime) { if (prevFuseTime <= 0) { currentTarget.GetComponent <Bomb>()?.fuseSparkleEffect.SetActive(true); SimulationState.Instance.OnBombFused(); } else if (newFuseTime <= 0) { currentTarget.GetComponent <Bomb>()?.fuseSparkleEffect.SetActive(false); SimulationState.Instance.OnBombDefused(); } UiSoundFx.GetOrCreate().PlayAdjustFuse(); currentTarget.SetTimeToDetonate(newFuseTime); } // update recorded mouse position, carrying over any remainder prevMousePos = newMousePos; prevMousePos.x -= (distance % distanceThreshold) * Mathf.Sign(delta); } }
public void BeginInteraction(Fuse fuse) { if (SimulationState.Instance.CurrentMode != SimulationState.Mode.Edit) { return; } if (currentTarget != null) { return; } if (fuse.timeToDetonate <= 0 && !SimulationState.Instance.CanFuseBomb) { fuse.GetComponent <Bomb>()?.PlayNoFuseFx(); return; } currentTarget = fuse; prevMousePos = Input.mousePosition; fuse.GetComponent <Bomb>()?.PlaySelectFx(); }
private void LoadFuseSettings() { Transform root = GetBombs().transform; foreach (var pair in fuseSettings) { Fuse fuse = root.GetChild(pair.Key).GetComponent <Fuse>(); fuse.SetTimeToDetonate(pair.Value); } foreach (var fuse in GetBombs().GetComponentsInChildren <Fuse>()) { if (fuse.timeToDetonate > 0) { fuse.GetComponent <Bomb>()?.fuseSparkleEffect.SetActive(true); } } playState.fusedBombs = fuseSettings.Count; }
// BIG TODO cmprobar que cada vez que obtengo un componente, este exista void Update() { if (isMoving) { t += Time.deltaTime; if (t > 1.0f) { isMoving = false; // Al llegar a su destino se puede agarrar de nuevo GrabableObj gro = fuse.gameObject.GetComponent <GrabableObj>(); gro.CanBeGrabbed = true; } GameObject go = fuse.gameObject; go.transform.position = Vector3.Lerp(go.transform.position, transform.position, t); go.transform.rotation = Quaternion.Lerp(go.transform.rotation, transform.rotation, t); } // Si aun tenemos fusible y no esta cogido else if (fuse != null && fuse.GetComponent <GrabableObj>().GetGrabber() == null) { // Comprobar si se ha movido // En caso de ser asi, reactivar el movimiento automatico float movementP = Vector3.Distance(transform.position, fuse.gameObject.transform.position); float movementR = Mathf.Abs(Quaternion.Angle(transform.rotation, fuse.gameObject.transform.rotation)); bool moved = movementP > 0.05f || movementR > 0.5f; if (moved) { isMoving = true; t = 0.0f; GrabableObj gro = fuse.gameObject.GetComponent <GrabableObj>(); gro.CanBeGrabbed = false; gro.IsDistanceGrabbable = false; fuse.gameObject.GetComponent <Rigidbody>().isKinematic = true; } } }