예제 #1
0
        private int _groundMask = 1 << 8; // Layer = Ground

        void Awake()
        {
            _thisTransform               = transform;
            _movementVariables           = new PlayerMovementVariables();
            _movementVariables.Direction = transform.TransformDirection(Vector3.forward);
            //_controller = GetComponent<CharacterController>();
            Spawn();
        }
예제 #2
0
    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        GameObject player = animator.gameObject;
        PlayerMovementVariables movementstats = player.GetComponent <PlayerMovementVariables>();


        // This if check may be redundant.
        // Only way into this state is for input is received.
        if (animator.GetFloat("Input/X") != 0 || animator.GetFloat("Input/Z") != 0)
        {
            // Direction for the player to move towards based on camera.
            Vector3 camerax          = (new Vector3(Camera.main.transform.right.x, 0, Camera.main.transform.right.z) * animator.GetFloat("Input/X"));
            Vector3 cameraz          = (new Vector3(Camera.main.transform.forward.x, 0, Camera.main.transform.forward.z) * animator.GetFloat("Input/Z"));
            Vector3 m_cameraPosition = (cameraz + camerax);
            //m_movement = m_movement.normalized;


            // Slightly different data is used but the math is the same in either case.
            // If locked on you rotate towards your target when you move resulting in
            // circling the target.
            if (EntityStats.Instance.GetObjectOfEntity("Player").GetComponent <PlayerMovementVariables>().m_lockon)
            {
                Vector3 bossdirection = movementstats.m_target.transform.position - player.transform.position;
                bossdirection = bossdirection.normalized;
                Quaternion targetRotation = Quaternion.LookRotation(bossdirection);
                player.transform.rotation = Quaternion.Slerp(player.transform.rotation, targetRotation, movementstats.m_rotationTime);
                ////Debug.DrawRay(player.transform.position, bossdirection);
                //float targetAngle = Mathf.Atan2(bossdirection.x, bossdirection.z) * Mathf.Rad2Deg;
                //float angle = Mathf.SmoothDampAngle(player.transform.eulerAngles.y, targetAngle, ref turnSmoothVelocity, movementstats.m_roationTime);
                //player.transform.rotation = Quaternion.Euler(0f, angle, 0f);
            }
            else
            {
                // Position to look towards
                Quaternion targetRotation = Quaternion.LookRotation(m_cameraPosition);
                player.transform.rotation = Quaternion.Slerp(player.transform.rotation, targetRotation, movementstats.m_rotationTime);
            }

            m_movement = new Vector3(m_cameraPosition.x * movementstats.m_walkSpeed * Time.deltaTime, 0, m_cameraPosition.z * movementstats.m_walkSpeed * Time.deltaTime);

            //Debug.Log(m_movement);
            //Debug.DrawRay(player.transform.position, m_movement);
            player.GetComponent <Rigidbody>().MovePosition(player.transform.position + m_movement);
            //player.transform.position = player.transform.position + m_movement;
            // What to pass to the animator.
            // May need extra rules to avoid sidesteps into diagonal.
            // They would go after the norm.
            Vector3 toAnim = player.transform.worldToLocalMatrix * m_movement;
            toAnim = toAnim.normalized;
            //Debug.DrawRay(player.transform.position,toAnim);
            //Debug.Log(toAnim);
            animator.SetFloat("Movement/X", toAnim.x);
            animator.SetFloat("Movement/Z", toAnim.z);
        }
    }