상세 컨텐츠

본문 제목

유니티 몬스터가 캐릭터한테 점프해서 도달하기

유니티/기능

by MJ_119 2025. 1. 20. 17:32

본문

유니티 몬스터가 캐릭터한테 점프해서 도달하기 ( 반대도 가능 )

 

***** (속도 = 거리/시간)

 


    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;
    }
}

 

관련글 더보기