Ejemplo n.º 1
0
 private void OnCollisionEnter(Collision collision)
 {
     // Nota: Igual hay que aplicar este cambio también por tiempo
     if (currentDamping == DampingType.None)
     {
         currentDamping = DampingType.TwoDimensional;
     }
 }
Ejemplo n.º 2
0
    public RigidBodyData()
    {
        inertia    = TSMatrix.InternalIdentity;
        invInertia = TSMatrix.InternalIdentity;

        invInertiaWorld = TSMatrix.InternalIdentity;
        orientation     = TSMatrix.InternalIdentity;
        invOrientation  = TSMatrix.InternalIdentity;
        position        = TSVector.zero;
        linearVelocity  = TSVector.zero;
        angularVelocity = TSVector.zero;

        staticFriction = FP.Zero;
        restitution    = FP.Zero;

        boundingBox = new TSBBox();

        inactiveTime = FP.Zero;

        isActive          = true;
        isStatic          = false;
        isKinematic       = false;
        affectedByGravity = true;
        isColliderOnly    = false;

        inverseMass = FP.Zero;

        force  = TSVector.zero;
        torque = TSVector.zero;

        hashCode = 0;

        internalIndex = 0;

        marker = 0;

        disabled = false;

        _freezePosition = TSVector.zero;

        _freezeRotation     = TSMatrix.InternalIdentity;
        _freezeRotationQuat = TSQuaternion.identity;

        // Previous state of gravity before switch Kinematic to true
        prevKinematicGravity = false;

        linearDrag = FP.Zero;

        angularDrag = FP.Zero;

        isParticle = false;

        shape = new ShapeData();

        damping = DampingType.Angular | DampingType.Linear;
    }
Ejemplo n.º 3
0
 //
 public void ChangeDampingType(DampingType newDampingType)
 {
     currentDamping        = newDampingType;
     not2dDCurrentDuration = 0;
     // Problemente pongamos también efecto de sonido de frenazo
 }
Ejemplo n.º 4
0
    /// <summary>
    ///
    /// </summary>
    void AxisMotion(float dt)
    {
        // Primero pillamos el eje del joystick
        Vector2 movementAxis = inputManager.StickAxis;

        // TODO: Decidir si aplicar aqui el countdown del damping
        if (currentDamping != DampingType.TwoDimensional)
        {
            //
            not2dDCurrentDuration += dt;
            if (not2dDCurrentDuration > not2dDMaxDuration)
            {
                currentDamping        = DampingType.TwoDimensional;
                not2dDCurrentDuration = 0;
            }
        }

        //
        Vector3 directionZ = mainCamera.forward * movementAxis.y;
        Vector3 directionX = mainCamera.right * movementAxis.x;

        // First check sprint
        float   sprintMultiplier = 1;
        Vector3 currentUp        = Vector3.up;

        //
        if (gameManager.playerAttributes.unlockedSprintActions > 0)
        {
            RaycastHit adherencePoint;
            // TODO: Meter aqui el dash cuando otra habilidad está cargando
            if (inputManager.SprintButton && actionCharging != ActionCharguing.None && actionCharging != ActionCharguing.Sprint)
            {
                repulsor.RepulsorDash(directionX + directionZ);
            }
            //
            if (inputManager.SprintButton && actionCharging == ActionCharguing.None)
            {
                switch (sprintMode)
                {
                case SprintMode.Normal:
                    actionCharging = ActionCharguing.Sprint;
                    break;

                //case SprintMode.RepulsorDash:
                //    // TODO: Aquí haremos el impulso
                //    // Más abajo están los parámetros que necesitamos
                //    // Ahora pilla la velocidad en xz, probablemene quermos aplicarlo en la dirección del eje
                //    repulsor.RepulsorDash(directionX + directionZ);
                //    break;
                case SprintMode.Adherence:
                    // Let's check if there are a surface near
                    if (AdherenceCheck(out adherencePoint) != false)
                    {
                        // Trabajamos con el punto y la normal
                        //adherencePoint.normal
                        actionCharging = ActionCharguing.Sprint;
                        SetNewUp(adherencePoint.point, adherencePoint.normal);
                        currentUp     = adherencePoint.normal;
                        chargedAmount = 1;
                        adhering      = true;
                        //cameraControl.
                        Debug.Log("Adherence point found");
                    }
                    break;
                }
            }
            else if (inputManager.SprintButton && actionCharging == ActionCharguing.Sprint)
            {
                switch (sprintMode)
                {
                case SprintMode.Normal:
                    // De momento el multiplicador irá de 1 a 2
                    chargedAmount    += Time.deltaTime;
                    chargedAmount     = Mathf.Min(chargedAmount, gameManager.playerAttributes.maxCharge);
                    sprintMultiplier += chargedAmount;
                    break;

                case SprintMode.Adherence:
                    if (AdherenceCheck(out adherencePoint) != false)
                    {
                        // Trabajamos con el punto y la normal
                        //adherencePoint.normal
                        SetNewUp(adherencePoint.point, adherencePoint.normal);
                        currentUp = adherencePoint.normal;
                        Vector3 gravityForce   = Vector3.up * -rb.velocity.y;
                        Vector3 adherenceForce = -transform.up * 1;
                        rb.AddForce(gravityForce + adherenceForce, ForceMode.Impulse);
                        //chargedAmount = 1;
                        //cameraControl.
                        Debug.Log("Adherenring to something");
                    }
                    else
                    {
                        Debug.Log("Adherenrce lost");
                        chargedAmount  = 0;
                        actionCharging = ActionCharguing.None;
                        adhering       = false;
                    }

                    break;
                }
            }
            else if (chargedAmount > 0 && actionCharging == ActionCharguing.Sprint)
            {
                //
                if (sprintMode == SprintMode.Normal && chargedAmount < 0.2f)
                {
                    repulsor.RepulsorDash(directionX + directionZ);
                }
                //
                chargedAmount  = 0;
                actionCharging = ActionCharguing.None;
                adhering       = false;
            }
        }



        // The movement direction will depend on the current up
        directionZ = Vector3.ProjectOnPlane(directionZ, currentUp).normalized;
        directionX = Vector3.ProjectOnPlane(directionX, currentUp).normalized;

        // En estos casos el player estará encarado con el objetivo
        if (actionCharging == ActionCharguing.Attack ||
            (actionCharging == ActionCharguing.Defense && defenseMode == DefenseMode.Front) ||
            (actionCharging == ActionCharguing.Jump && jumpMode == JumpMode.Smash))
        {
            // Si no targetea al player
            // Osea un enemigo
            // Puesto aqui por si sacamos más casos (cinematicas por ejemplo)
            if (!cameraControl.TargetingPlayer)
            {
                //
                // TODO: Ajustar el stimated para que pille bien
                Vector3 pointToLook = EnemyAnalyzer.estimatedToHitPosition;
                transform.LookAt(pointToLook, currentUp);
            }
            else
            {
                //transform.LookAt(transform.position + cameraControl.transform.forward, currentUp);
                transform.rotation = mainCamera.rotation;
            }
        }
        else
        {
            // Para que ajuste la rotación poco a poco
            if ((directionX + directionZ).magnitude > Mathf.Epsilon)
            {
                currentRotationTime = 0;
                lastAxisXZ          = directionX + directionZ;
            }
            //
            objectiveRotation    = Quaternion.LookRotation(lastAxisXZ, currentUp);
            currentRotationTime += dt;
            transform.rotation   = Quaternion.Slerp(transform.rotation, objectiveRotation, currentRotationTime / rotationTime);

            //transform.LookAt(transform.position + directionX + directionZ, currentUp);
        }


        // TODO: Tener en cuenta velocity actual
        Vector3 forceDirection = (directionX + directionZ).normalized;

        rb.AddForce(forceDirection * gameManager.playerAttributes.movementForcePerSecond * sprintMultiplier * dt, ForceMode.Impulse);

        // And dampen de movement
        if (currentDamping == DampingType.TwoDimensional)
        {
            Vector3 currentVelocity = rb.velocity;
            currentVelocity.x *= 1 - (damping * dt);
            currentVelocity.z *= 1 - (damping * dt);
            rb.velocity        = currentVelocity;
        }
        else if (currentDamping == DampingType.ThreeDimensional)
        {
            //
            rb.velocity *= 1 - (damping * dt);
        }
    }