Ejemplo n.º 1
0
        private static bool CastWallQ(Obj_AI_Base target)
        {
            //400 castdelay instead of 250.
            PredictionResult pred = Prediction.Position.PredictLinearMissile(target, 850f, 60, 400, 2000f, 0, Player.Instance.Position, true);

            if (Player.Instance.CheckWallCollison(pred.CastPosition))
            {
                return(false);
            }

            Vector3 QEndPosition = pred.CastPosition.ExtendVector3(Player.Instance.Position, -(Spells["q"].Range - Player.Instance.Distance(pred.CastPosition)));

            for (int i = 0; i < pred.CastPosition.Distance(QEndPosition); i += 30)
            {
                Vector3        wallPosition   = pred.CastPosition.ExtendVector3(QEndPosition, pred.CastPosition.Distance(QEndPosition) - i);
                CollisionFlags collisionFlags = NavMesh.GetCollisionFlags(wallPosition);

                if (collisionFlags.HasFlag(CollisionFlags.Wall) || collisionFlags.HasFlag(CollisionFlags.Building))
                {
                    if (Spells["q"].Cast(pred.CastPosition))
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
 private void TrackPosition()
 {
     if (collision.HasFlag(CollisionFlags.Below))
     {
         lastAlivePos = transform.position;
     }
 }
Ejemplo n.º 3
0
        /// <summary>
        /// Create and attach a new collision body to this Entity.
        /// </summary>
        /// <param name="world">CollisionWorld instance.</param>
        /// <param name="type">Type of collision body.  Dynamic bodies receive responses, kinematic bodies do not.  Static bodies cannot move.</param>
        /// <param name="flags">Flags.</param>
        public void CreateCollisionBody(Physics.Dynamics.World world, Physics.Dynamics.BodyType type, CollisionFlags flags = CollisionFlags.Default)
        {
            if (CollisionBody != null)
            {
                throw new ArgumentException("CreateCollisionBody called on Entity where collision body already exists.");
            }
            CollisionWorld = world;

            Physics.Dynamics.Body body = world.CreateBody();

            body.BodyType = type;
            body.Position = m_position * GameEnvironment.k_physicsScale;
            if (!VisualRotationOnly)
            {
                body.Rotation = m_rotation;
            }
            body.LinearVelocity  = m_velocity * GameEnvironment.k_physicsScale;
            body.FixedRotation   = flags.HasFlag(CollisionFlags.FixedRotation);
            body.SleepingAllowed = !flags.HasFlag(CollisionFlags.DisableSleep);
            body.IsBullet        = flags.HasFlag(CollisionFlags.IsBullet);
            body.UserData        = this;

            CollisionBody = body;
        }
Ejemplo n.º 4
0
        private void ApplyMovement()
        {
            _nextVelocity.y = CalculateVerticalSpeed();

            switch (locomotion)
            {
            case LocomotionMode.Velocity:
                rigidbody.velocity = nextVelocity;
                applyMovement      = false;
                break;

            case LocomotionMode.Force:
                if (rigidbody.velocity.sqrMagnitude >= nextSpeedSquared)
                {
                    //nextVelocity = Vector3.zero;
                    applyMovement = false;
                }
                else
                {
                    Vector3 force = nextVelocity;
                    rigidbody.AddForce(force, ForceMode.Impulse);
                }
                break;

            case LocomotionMode.CharacterController:
                CollisionFlags flags = characterController.Move(nextVelocity * deltaTime);
                if (!flags.HasFlag(CollisionFlags.CollidedBelow))
                {
                    grounded = false;
                }
                applyMovement = false;
                break;

            case LocomotionMode.NavMeshAgent:
                navMeshAgent.Move(nextVelocity * deltaTime);
                applyMovement = false;
                break;
            }

            if (!jumping && !falling)
            {
                nextVelocity = Vector3.zero;
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 上下移動
        /// </summary>
        void VerticalMove()
        {
            float v = Input.GetAxisRaw("Vertical");

            StellaMove.myVelocity.y = v * upDownSpeed;

            // 登り切ったチェック
            if (v > 0.5f)
            {
                if (!StellaMove.IsIvyUp())
                {
                    // 前方に飛び降り
                    StellaMove.myVelocity.x = StellaMove.MiniJumpSpeedMax * StellaMove.forwardVector.x;
                    StellaMove.myVelocity.y = putDownSpeedY;
                    StellaMove.instance.Gravity();
                    StellaMove.instance.Move();
                    StellaMove.instance.ChangeAction(StellaMove.ActionType.Air);
                    return;
                }
            }

            // 移動
            float          lastY = StellaMove.instance.transform.position.y;
            CollisionFlags flags = StellaMove.ChrController.Move(StellaMove.myVelocity * Time.fixedDeltaTime);

            if (flags.HasFlag(CollisionFlags.Below) && StellaMove.myVelocity.y < 0f)
            {
                // 下にぶつかっていたらツタを離す
                StellaMove.myVelocity = Vector3.zero;
                StellaMove.instance.ChangeAction(StellaMove.ActionType.Walk);
                return;
            }

            float vely = (lastY - StellaMove.instance.transform.position.y) / Time.fixedDeltaTime;

            if (Mathf.Abs(vely) < Mathf.Abs(StellaMove.myVelocity.x))
            {
                vely = StellaMove.myVelocity.x;
            }
            StellaMove.SetAnimFloat("VelY", vely);
        }
Ejemplo n.º 6
0
    private void ApplyTailGrav(float dt)
    {
        if (butt == null)
        {
            return;
        }
        butt.transform.position = back_handle.position;
        butt.enabled            = true;

        back_up_vel += Physics.gravity * dt;

        CollisionFlags cf = butt.Move(back_up_vel * dt);

        if (cf.HasFlag(CollisionFlags.Below))
        {
            back_up_vel = Vector3.zero;
        }

        back_handle.transform.position = butt.transform.position;

        butt.enabled = false;
    }
Ejemplo n.º 7
0
        /// <summary>
        /// Create and attach a new collision body to this Entity.
        /// </summary>
        /// <param name="world">CollisionWorld instance.</param>
        /// <param name="type">Type of collision body.  Dynamic bodies receive responses, kinematic bodies do not.  Static bodies cannot move.</param>
        /// <param name="flags">Flags.</param>
        public void CreateCollisionBody(Physics.Dynamics.World world, Physics.Dynamics.BodyType type, CollisionFlags flags = CollisionFlags.Default)
        {
            if (CollisionBody != null) throw new ArgumentException("CreateCollisionBody called on Entity where collision body already exists.");
            CollisionWorld = world;

            Physics.Dynamics.Body body = world.CreateBody();

            body.BodyType = type;
            body.Position = m_position * GameEnvironment.k_physicsScale;
            if (!VisualRotationOnly) body.Rotation = m_rotation;
            body.LinearVelocity = m_velocity * GameEnvironment.k_physicsScale;
            body.FixedRotation = flags.HasFlag(CollisionFlags.FixedRotation);
            body.SleepingAllowed = !flags.HasFlag(CollisionFlags.DisableSleep);
            body.IsBullet = flags.HasFlag(CollisionFlags.IsBullet);
            body.UserData = this;

            CollisionBody = body;
        }
Ejemplo n.º 8
0
    // Update is called once per frame
    void Update()
    {
        float stamina_start = stamina;

        if (can_climb && Input.GetButton("Climb"))
        {
            state = FerretState.Climbing;
        }
        else if (state == FerretState.Climbing)
        {
            state = FerretState.Idle;
        }

        float sprint = Input.GetAxis("Sprint");

        bool hit_obj    = false;
        bool moved      = false;
        bool butt_moved = false;

        for (int c = 0; c < origins.Length; c++)
        {
            origins[c] = trail[c].position;
        }

        float dt = Time.deltaTime;

        float joystick_x = Input.GetAxis("Horizontal");
        float joystick_y = Input.GetAxis("Vertical");

        float magnitude = new Vector2(joystick_x, joystick_y).magnitude;

        Vector3             movement = new Vector3();
        CharacterController cc       = GetComponent <CharacterController>();

        if (can_climb)
        {
            climb_timer = (climb_timer + dt > LookTime) ? LookTime : climb_timer + dt;
        }
        else
        {
            climb_timer = (climb_timer - dt < 0.0f) ? 0.0f : climb_timer - dt;
        }

        Vector3 dir;

        switch (state)
        {
        case FerretState.Climbing:
            movement += Vector3.up * PLAYER_SPEED * dt;
            break;

        case FerretState.Slipping:
            dir = Quaternion.Euler(0.0f, player_orientation, 0.0f) * Vector3.forward;
            ApplyGravity(ref movement, dt);
            movement += (dir * PLAYER_SPEED) * dt;

            break;

        default:
            if (on_ground && Input.GetButton("Jump") && stamina > 0.0f)
            {
                Jump(PLAYER_JUMP);

                stamina -= JumpCost;
            }

            ApplyGravity(ref movement, dt);

            if (magnitude > 0.01f)
            {
                float theta = (Mathf.Atan2(joystick_x, joystick_y) * Mathf.Rad2Deg);

                if (Cam != null)
                {
                    theta += Cam.GetTheta();
                }

                if (Mathf.Abs(theta - player_orientation) > Mathf.Abs((theta + 360.0f) - player_orientation))
                {
                    theta += 360.0f;
                }
                else if (Mathf.Abs(theta - player_orientation) > Mathf.Abs((theta - 360.0f) - player_orientation))
                {
                    theta -= 360.0f;
                }

                float t_change = 0.0f;
                if (theta != player_orientation)
                {
                    t_change = (theta - player_orientation) / Mathf.Abs(theta - player_orientation);
                }

                player_orientation += t_change * ROT_SPEED * dt;

                if (player_orientation > 360.0f)
                {
                    player_orientation -= 360.0f;
                }
                else if (player_orientation < -360.0f)
                {
                    player_orientation += 360.0f;
                }

                transform.rotation = Quaternion.Euler(0.0f, player_orientation, 0.0f) * handle_rot;

                dir = Quaternion.Euler(0.0f, player_orientation, 0.0f) * Vector3.forward;

                Vector3 input_motion = (dir * PLAYER_SPEED) * dt;

                if (on_ground && sprint > 0.0f && stamina > 0.0f)
                {
                    input_motion *= SprintModifier;

                    stamina -= SprintCost * dt;
                }

                movement += input_motion;

                if (handle != null)
                {
                    handle.rotation = transform.rotation;
                }
            }
            break;
        }

        if (cc != null)
        {
            Vector3 start_pos = cc.transform.position;

            CollisionFlags hits = cc.Move(movement);

            Vector3 end_pos = cc.transform.position;

            if (hits.HasFlag(CollisionFlags.Sides))
            {
                //Debug.Log("HOI!!!");
                hit_obj = true;
            }
            if (hits.HasFlag(CollisionFlags.Below))
            {
                //frwd_up_vel = Vector3.zero;
                on_ground     = true;
                frwd_up_vel.y = Physics.gravity.y / 2.0f;

                Vector3 b_start = trail[trail.Length - 1].transform.position;
                ApplyTailGrav(dt);
                Vector3 b_end = trail[trail.Length - 1].transform.position;

                if (!Mathf.Approximately((b_end - b_start).magnitude, 0.0f))
                {
                    butt_moved = true;
                }
            }
            else
            {
                on_ground = false;
            }

            if (!Mathf.Approximately((end_pos - start_pos).magnitude, 0.0f))
            {
                moved = true;
            }
        }
        else
        {
            transform.position += movement;
        }

        if (handle != null)
        {
            handle.position = transform.position;
        }

        if (!hit_obj && (moved || butt_moved))
        {
            AdjustTail();
        }

        /*
         * if (butt != null)
         * {
         *      Vector3 front_to_back = transform.position - butt.transform.position;
         *
         *      Vector3 back_move = new Vector3();
         *
         *      if (front_to_back.magnitude > 5.0f)
         *      {
         *              butt.transform.rotation = Quaternion.LookRotation(front_to_back.normalized, Vector3.up);
         *
         *              back_move += front_to_back.normalized * PLAYER_SPEED * dt;
         *      }
         *
         *      back_move += Physics.gravity * dt;
         *      butt.Move(back_move);
         *
         *      if (back_handle != null)
         *      {
         *              back_handle.position = butt.transform.position;
         *              //back_handle.transform.rotation = butt.transform.rotation;
         *      }
         * }
         */

        // Stamina
        if (Mathf.Approximately(stamina_start - stamina, 0.0f))
        {
            if (srt > 0.0f)
            {
                srt -= dt;
            }
            else
            {
                stamina += StaminaRecovery * dt;
                if (stamina > MaxStamina)
                {
                    stamina = MaxStamina;
                }
            }
        }
        else
        {
            srt = StaminaRecoveryTime;
        }

        StaminaDisplay.text = stamina.ToString();
    }