0a94f674abd531a04e81d2b628f17165363313fa


움직이는 로직을 좀 바꾸고

코드를 더욱 깔끔하게 다듬었다 크큭...

50줄 가까이 절약한 데스웅




using System.Collections;

using System.Collections.Generic;

using UnityEngine;


public class AnimationAndMovementControllerForChild : MonoBehaviour

{

    Animator animator;

    int walkHash;

    int runHash;


    [SerializeField]

    GameObject parent;

    [SerializeField]

    float distanceMultiplier = -0.6f;

    [SerializeField]

    float positionOffsetX = 0f;

    [SerializeField]

    float positionOffsetZ = 0f;

    [SerializeField]

    float startRunningDistance = 2.0f;


    [SerializeField]

    float rotationFactorPerFrame = 3.0f;

    [SerializeField]

    float movementSpeed = 0.75f;

    [SerializeField]

    float runMultiplier = 2.0f;


    byte movementState;


    Vector3 getGoTo()

    {

        float x = parent.transform.position.x + ((parent.transform.forward.x * distanceMultiplier) + positionOffsetX);

        float z = parent.transform.position.z + ((parent.transform.forward.z * distanceMultiplier) + positionOffsetZ);

        return new Vector3(x, 0, z);

    }


    float getDistance()

    {

        return Vector3.Distance(getGoTo(), transform.position);

    }


    private void handleRotation()

    {

        Vector3 positionToLookAt;


        if (getDistance() < 0.3)

        {

            positionToLookAt = parent.transform.position - transform.position;

        }

        else

        {

            positionToLookAt = getGoTo() - transform.position;

        }


        Quaternion currentRotation = transform.rotation;

        Quaternion targetRotation = Quaternion.LookRotation(positionToLookAt, Vector3.up);

        transform.rotation = Quaternion.Slerp(currentRotation, targetRotation, rotationFactorPerFrame * Time.deltaTime);

    }


    private void handleMovement(byte movementState)

    {

        Vector3 positionToGoTo = getGoTo();


        switch (movementState)

        {

            case 1: //walk

                transform.position = Vector3.MoveTowards(transform.position, positionToGoTo, movementSpeed * Time.deltaTime);

                break;

            case 2: //run

                transform.position = Vector3.MoveTowards(transform.position, positionToGoTo, movementSpeed * runMultiplier * Time.deltaTime);

                break;

        }

    }


    private void handleAnimation(byte movementState)

    {

        switch (movementState)

        {

            case 0: //idle

                animator.SetBool(walkHash, false);

                animator.SetBool(runHash, false);

                break;

            case 1: //walk

                animator.SetBool(walkHash, true);

                animator.SetBool(runHash, false);

                break;

            case 2: //run

                animator.SetBool(runHash, true);

                break;

        }

    }


    private void Awake()

    {

        animator = GetComponent<Animator>();

        walkHash = Animator.StringToHash("Walk");

        runHash = Animator.StringToHash("Run");

    }


    void Update()

    {

        if (getDistance() < 0.1)

        {

            movementState = 0;

        }

        else if (getDistance() < startRunningDistance && movementState != 2)

        {

            movementState = 1;

        }

        else

        {

            movementState = 2;

        }

        handleRotation();

        handleMovement(movementState);

        handleAnimation(movementState);

    }

}