Exemplo n.º 1
0
    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);
        }
    }
Exemplo n.º 2
0
    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();
    }
Exemplo n.º 3
0
    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;
    }
Exemplo n.º 4
0
    // 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;
            }
        }
    }