Пример #1
0
    public void ZapperCharged()
    {
        Transmissible thisTransmissable = GetComponent <Transmissible>();

        if (thisTransmissable.type.name == "Energy" && !alreadyUsed)
        {
            Debug.Log("Charged with energy!");
            StartCoroutine(ZapperActive());
        }
    }
Пример #2
0
    public void CheckType()
    {
        Transmissible thisTransmissable = GetComponent <Transmissible>();

        if (thisTransmissable.type.name == requiredType)
        {
            TypeCorrect.Invoke();
        }
        else if (thisTransmissable.type.name != requiredType)
        {
            TypeIncorrect.Invoke();
        }
    }
Пример #3
0
    void OnTriggerEnter(Collider collider)
    {
        Audible audible = collider.GetComponent <Audible>();

        if (audible)
        {
            audible.SoundEvent("Footstep", transform.position);
        }

        Transmissible t = collider.GetComponent <Transmissible>();

        if (t && t.type.audibleType && t.progress == 1 && m_player.isGrounded == true && m_player.inFluid == false)
        {
            Audible.SoundEvent(t.type.audibleType, "Footstep", transform.position);
        }
    }
Пример #4
0
    // Update is called once per frame
    void FixedUpdate()
    {
        bool prevGrounded = m_grounded;

        m_grounded = false;
        m_ground   = null;

        // Check if we're floating in something
        Collider[] colliders = Physics.OverlapSphere(m_rigidbody.position, m_collider.radius, m_groundMask);

        foreach (var c in colliders)
        {
            Transmissible t = c.GetComponent <Transmissible>();
            if (t && t.progress == 1 && t.type.bouyancy > 0)
            {
                m_grounded     = true;
                m_ground       = t.gameObject;
                m_groundNormal = Vector3.up;
            }
        }

        if (m_grounded == false)
        {
            RaycastHit[] hits = Physics.SphereCastAll(m_rigidbody.position,
                                                      m_collider.radius - 0.01f,
                                                      Vector3.down,
                                                      m_collider.height / 2 - m_collider.radius + 0.02f,
                                                      m_groundMask,
                                                      QueryTriggerInteraction.Ignore);

            foreach (RaycastHit hit in hits)
            {
                if (hit.normal.y > 0.5f)
                {
                    float distanceFromRim = Mathf.Abs((m_rigidbody.position.y - m_collider.height / 2) - hit.point.y);

                    distanceFromRimDebug = distanceFromRim;

                    if (distanceFromRim < 0.25f)
                    {
                        m_grounded     = true;
                        m_ground       = hit.collider.gameObject;
                        m_groundNormal = hit.normal;
                    }
                    break;
                }
            }
        }

        Vector2 localDir = m_input.movement;

        // TODO: Check grounded state

        Vector3 force = (Camera.main.transform.right * localDir.x + Camera.main.transform.forward * localDir.y);

        if (m_stunTimer > 0)
        {
            m_stunTimer -= Time.deltaTime;
            force.x      = 0;
            force.z      = 0;
        }

        force.y = 0;

        if (force.magnitude > 0)
        {
            force.Normalize();

            bool abyss = false;
            if (m_fallPreventionEnabled)
            {
                RaycastHit[] hits = Physics.SphereCastAll(m_rigidbody.position + force * m_collider.radius * 2, m_collider.radius, Vector3.down, 100, m_groundMask);

                abyss = true;
                foreach (RaycastHit hit in hits)
                {
                    // Solid object or bouyand object
                    Transmissible t = hit.collider.GetComponent <Transmissible>();
                    if (t)
                    {
                        if ((t.type.hasCollisions == true || (t.type.bouyancy > 0 && t.progress == 1)))
                        {
                            abyss = false;
                            break;
                        }
                    }
                    else if (hit.collider.isTrigger == false)
                    {
                        abyss = false;
                        break;
                    }
                }
            }

            if (m_grounded)
            {
                Vector3 right = Vector3.Cross(force, Vector3.up);
                force = Vector3.Cross(m_groundNormal, right);
            }

            if (abyss)
            {
                force = Vector3.zero;
            }

            m_rigidbody.AddForce(force * m_maxForce);
        }

        Vector3 velocity = m_rigidbody.velocity;
        float   vy       = velocity.y;

        velocity.y = 0;


        if (velocity.magnitude > m_maxVelocity)
        {
            velocity = velocity.normalized * m_maxVelocity;
        }

        //m_rigidbody.drag = velocity.magnitude / m_drag;

        if (velocity.magnitude > 0.25f && m_stunTimer <= 0)
        {
            m_angle = Mathf.Atan2(velocity.x, velocity.z) * Mathf.Rad2Deg;
        }

        transform.localEulerAngles = new Vector3(0, m_angle, 0);

        velocity *= m_friction;

        if (m_grounded && m_ground)
        {
            if (prevGrounded == false)
            {
                Audible a = m_ground.GetComponent <Audible>();
                if (a)
                {
                    a.SoundEvent("Land", transform.position);
                }

                Transmissible t = m_ground.GetComponent <Transmissible>();
                if (t && t.type.audibleType && t.progress == 1)
                {
                    Audible.SoundEvent(t.type.audibleType, "Land", transform.position);
                }
            }

            if (inFluid)
            {
                if (m_input.wasJumpPressed)
                {
                    velocity.y = Mathf.Lerp(velocity.y, m_waterJumpSpeed, 0.25f);
                }
                else
                {
                    velocity.y = vy;
                }

                m_animator.SetFloat("Speed", 0.0f);
                m_animator.SetFloat("Speed2", 0.1f);
            }
            else
            {
                velocity.y = 0;

                if (m_input.wasJumpPressed)
                {
                    m_grounded = false;
                    // TODO: check water
                    velocity.y = m_jumpSpeed;
                    m_animator.SetTrigger("Jump");
                }

                m_animator.SetFloat("Speed", velocity.magnitude / m_maxVelocity);
                m_animator.SetFloat("Speed2", 0.1f + (velocity.magnitude / m_maxVelocity) * 1.5f);
            }
        }
        else
        {
            velocity.y = vy;

            m_animator.SetFloat("Speed", 0.5f);
            m_animator.SetFloat("Speed2", 0.1f);
        }

        m_animator.SetFloat("YSpeed", velocity.y);
        m_animator.SetBool("Grounded", m_grounded && !inFluid);
        m_animator.SetBool("InFluid", inFluid);
        m_rigidbody.velocity = velocity;
    }
Пример #5
0
    Transmissible DetectObject()
    {
        Vector3 origin = transform.position;
        Vector3 dir    = transform.forward;

        Transmissible minTarget = null;
        float         minAngle  = 0;

        for (int i = 0; i < m_rays; i++)
        {
            float   rayAngle = -m_detectionSpread + (m_detectionSpread * 2.0f) * (i / (float)m_rays);
            Vector3 dir2     = Quaternion.AngleAxis(rayAngle, Vector3.up) * dir;
            Vector3 hitPoint = origin + dir2 * m_detectionDistance;
            Color   hitColor = Color.gray;

            RaycastHit hit;
            if (Physics.Raycast(origin, dir2, out hit, m_detectionDistance, m_detectionMask))
            {
                Transmissible t = hit.collider.gameObject.GetComponent <Transmissible>();
                if (t)
                {
                    hitPoint = hit.point;

                    if (minTarget == null || Mathf.Abs(rayAngle) < minAngle)
                    {
                        minTarget         = t;
                        minAngle          = Mathf.Abs(rayAngle);
                        hitColor          = Color.yellow;
                        m_targetHitPoint  = minTarget.transform.InverseTransformPoint(hit.point);
                        m_targetHitNormal = hit.normal;
                    }
                }
            }
            Debug.DrawLine(origin, hitPoint, hitColor);
        }

        if (minTarget == null)
        {
            minAngle = 0;

            for (int i = 0; i < m_rays; i++)
            {
                float   rayAngle = -m_detectionSpread + (m_detectionSpread * 2.0f) * (i / (float)m_rays);
                Vector3 dir2     = Quaternion.AngleAxis(30, transform.right) * Quaternion.AngleAxis(rayAngle, Vector3.up) * dir;
                Vector3 hitPoint = origin + dir2 * m_detectionDistance;
                Color   hitColor = Color.gray;

                RaycastHit hit;
                if (Physics.Raycast(origin, dir2, out hit, m_detectionDistance, m_detectionMask))
                {
                    Transmissible t = hit.collider.gameObject.GetComponent <Transmissible>();
                    if (t)
                    {
                        hitPoint = hit.point;

                        if (minTarget == null || Mathf.Abs(rayAngle) < minAngle)
                        {
                            minTarget         = t;
                            minAngle          = Mathf.Abs(rayAngle);
                            hitColor          = Color.yellow;
                            m_targetHitPoint  = minTarget.transform.InverseTransformPoint(hit.point);
                            m_targetHitNormal = hit.normal;
                        }
                    }
                }
                Debug.DrawLine(origin, hitPoint, hitColor);
            }
        }

        if (minTarget)
        {
            // Reject direct down hits
            RaycastHit hit;
            if (Physics.Raycast(origin, -Vector3.up, out hit, m_detectionDistance, m_detectionMask))
            {
                if (hit.collider.GetComponent <Transmissible>() == minTarget)
                {
                    minTarget = null;
                }
            }
        }


        return(minTarget);
    }
Пример #6
0
    public void DetectObjects()
    {
        if (m_target)
        {
            m_target.GetComponent <Highlightable>().highlighted = false;
        }

        Transmissible newTarget = DetectObject();

        if (m_target != newTarget)
        {
            if (m_target)
            {
                if (m_target.state == Transmissible.State.Infusing)
                {
                    m_target.EndInfuse();
                    m_tank.EndDrain();
                }
                else if (m_target.state == Transmissible.State.Draining)
                {
                    m_target.EndDrain();
                    m_tank.EndInfuse();
                }
            }
        }

        if (newTarget)
        {
            m_target = newTarget;
            m_target.GetComponent <Highlightable>().highlighted = true;

            m_source.pitch  = m_target.progress + 0.5f;
            m_source.volume = m_soundCurve.Evaluate(m_target.progress);
        }
        else
        {
            m_target = null;
        }



        if (m_input.isDrainPressed && m_target && m_currentType == null)
        {
            if (m_target.state == Transmissible.State.Full)
            {
                //m_source.clip = m_target.type.drainClip;
                m_source.Play();

                TransmissibleType type = m_target.BeginDrain((Transmissible t) =>
                {
                    m_currentType = t.type;
                });

                m_tank.BeginInfuse(m_target.type, (Transmissible t) => { });
            }
        }
        else if (!m_input.isDrainPressed && m_target && m_target.state == Transmissible.State.Draining)
        {
            m_target.EndDrain();
            m_tank.EndInfuse();
        }
        else if (m_input.isInfusePressed && m_target && m_target.state == Transmissible.State.Empty && m_currentType != null)
        {
            //m_source.clip = m_target.type.infuseClip;
            m_source.Play();

            m_target.BeginInfuse(m_currentType, (Transmissible t) =>
            {
                // TODO: update visuals
                m_currentType = null;
            });
            m_tank.BeginDrain((Transmissible t) => { });
        }
        else if (!m_input.isInfusePressed && m_target && m_target.state == Transmissible.State.Infusing)
        {
            m_target.EndInfuse();
            m_tank.EndDrain();
        }

        //m_prevObjects = objects;
    }