유니티 몬스터가 캐릭터한테 점프해서 도달하기 ( 반대도 가능 )
***** (속도 = 거리/시간)
public void jumpAttack()
{
Vector3 lastPlayerPos = player.transform.position;
float travelTimeToTarget = 1.5f;
Vector3 myPos = enemy.transform.position;
float distanceToPlayer = Vector3.Distance(lastPlayerPos, enemy.transform.position);
float jumpAttackMovementSpeed = distanceToPlayer / travelTimeToTarget;
}
public void Update()
{
enemy.transform.position = Vector3.MoveTowards(myPos, lastPlayerPos, jumpAttackMovementSpeed * Time.deltaTime);
}
// 클래스 수준 변수로 선언
private Vector3 lastPlayerPos;
private Vector3 myPos;
private float jumpAttackMovementSpeed;
public Transform player;
public Transform enemy;
public void JumpAttack()
{
// 타겟 위치와 속도 계산
lastPlayerPos = player.transform.position;
myPos = enemy.transform.position;
float travelTimeToTarget = 1.5f;
float distanceToPlayer = Vector3.Distance(lastPlayerPos, enemy.transform.position);
jumpAttackMovementSpeed = distanceToPlayer / travelTimeToTarget;
}
private void Update()
{
// 실제 이동
enemy.transform.position = Vector3.MoveTowards(
enemy.transform.position, // myPos 대신 현재 위치 사용
lastPlayerPos,
jumpAttackMovementSpeed * Time.deltaTime
);
}
제자리 점프하는 애니메이션이 있는 경우 :
public class MonsterJumpAttack : MonoBehaviour
{
[SerializeField] private float jumpDuration = 1.5f;
private Animator animator;
private Transform playerTransform;
private Vector3 targetPosition;
private float elapsedTime;
private bool isJumping;
private CharacterController characterController; // 만약 CharacterController를 사용한다면
private void Start()
{
animator = GetComponent<Animator>();
playerTransform = GameObject.FindGameObjectWithTag("Player").transform;
characterController = GetComponent<CharacterController>(); // CharacterController 사용시
}
public void StartJumpAttack()
{
if (!isJumping)
{
// 점프를 시작할 때 플레이어의 위치를 저장
targetPosition = playerTransform.position;
elapsedTime = 0f;
isJumping = true;
// 점프 애니메이션 재생
animator.SetTrigger("JumpAttack");
// 플레이어를 향해 회전
Vector3 directionToPlayer = (targetPosition - transform.position).normalized;
transform.rotation = Quaternion.LookRotation(directionToPlayer);
}
}
private void Update()
{
if (isJumping)
{
elapsedTime += Time.deltaTime;
float normalizedTime = elapsedTime / jumpDuration;
if (normalizedTime <= 1f)
{
// 시작 위치에서 타겟 위치까지의 거리를 계산
Vector3 direction = (targetPosition - transform.position).normalized;
float speed = Vector3.Distance(transform.position, targetPosition) / jumpDuration;
// 실제 이동 구현
Vector3 movement = direction * speed * Time.deltaTime;
// CharacterController를 사용하는 경우
if (characterController != null)
{
characterController.Move(movement);
}
// Transform을 직접 사용하는 경우
else
{
transform.position += movement;
}
}
else
{
// 점프 종료
isJumping = false;
animator.SetTrigger("JumpEnd"); // 필요한 경우 착지 애니메이션
}
}
}
// 애니메이션 이벤트로 사용할 수 있는 메서드들
public void OnJumpStart()
{
// 점프 애니메이션이 실제로 시작될 때 호출
}
public void OnJumpEnd()
{
// 점프 애니메이션이 끝날 때 호출
isJumping = false;
}
}
유니티 유한상태기계 - FSM(Finite State Machine) 1 (0) | 2025.01.25 |
---|---|
유니티 스킬 쿨타임 (0) | 2025.01.20 |
유니티 Vector3.Distance() 거리구하기, 방향벡터 구하기 (0) | 2025.01.20 |
유니티 스크립터블 오브젝트 (0) | 2025.01.15 |
유니티 애니메이션 발(foot) 미끄러짐 해결하기 (0) | 2025.01.15 |