움직이는 로직을 좀 바꾸고
코드를 더욱 깔끔하게 다듬었다 크큭...
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);
}
}
굿
칭찬해
궁금한게 있는데 저 치킨에셋 어디서구한거임? 나도 구매하고싶은데