상세 컨텐츠

본문 제목

리지드바디 MovePosition() 캐릭터 이동 및 점프 구현

유니티/기능

by MJ_119 2024. 7. 17. 22:50

본문

@ 키 입력 부분은 Update() 에서 사용

 

@ 캐릭터 이동 코드, 애니메이션 X 

 

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveFixedUpdate : MonoBehaviour
{
    // 이동 구현
    private Rigidbody rb;
    public float moveSpeed = 5f; // 캐릭터 이동 속도
    private float horizontal;
    private float vertical;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        // 매 프레임 입력 받기
        horizontal = Input.GetAxis("Horizontal");
        vertical = Input.GetAxis("Vertical");
    }

    private void FixedUpdate()
    {
        CharacterMove();
        
    }

    public void CharacterMove()
    {
        // 키 입력 받기
        Vector3 moveInput = new Vector3(horizontal, 0.0f, vertical);

        // 입력 벡터 정규화 및 크기 조정
        if (moveInput.magnitude > 1)
        {
            moveInput = moveInput.normalized;
        }

        // 새로운 위치 계산
        Vector3 newPosition = rb.position + moveInput * moveSpeed * Time.fixedDeltaTime;
        
        // Rigidbody 속도를 0으로 설정하여 미끄러짐 방지
        //rb.velocity = Vector3.zero;
        
        // MovePosition으로 새로운 위치로 이동
        rb.MovePosition(newPosition);
    }
}

 

 

 


@ 캐릭터 이동 + 점프 코드, 애니메이션 X

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveFixedUpdate : MonoBehaviour
{
    // 이동 구현
    private Rigidbody rb;
    public float moveSpeed = 5f; // 캐릭터 이동 속도
    private float horizontal;
    private float vertical;
    
    // 점프 구현
    public float jumpHeight = 7f;
    private bool jump;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        // 매 프레임 입력 받기
        horizontal = Input.GetAxis("Horizontal");
        vertical = Input.GetAxis("Vertical");
        jump = Input.GetButtonDown("Jump");

        if(jump)
        {
            CharacterJump();
        }
    }

    private void FixedUpdate()
    {
        CharacterMove();
        
    }

    public void CharacterJump()
    {
        rb.AddForce(transform.up * jumpHeight, ForceMode.Impulse);
        
    }


    public void CharacterMove()
    {
        // 키 입력 받기
        Vector3 moveInput = new Vector3(horizontal, 0.0f, vertical);

        // 입력 벡터 정규화 및 크기 조정
        if (moveInput.magnitude > 1)
        {
            moveInput = moveInput.normalized;
        }

        // 새로운 위치 계산
        Vector3 newPosition = rb.position + moveInput * moveSpeed * Time.fixedDeltaTime;
        
        // Rigidbody 속도를 0으로 설정하여 미끄러짐 방지
        //rb.velocity = Vector3.zero;
        
        // MovePosition으로 새로운 위치로 이동
        rb.MovePosition(newPosition);
    }
}

 

 

@ 캐릭터 이동 + 점프 + 애니메이션

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveFixedUpdate : MonoBehaviour
{
    // 이동 구현
    private Rigidbody rb;
    public float moveSpeed = 5f; // 캐릭터 이동 속도
    private float horizontal;
    private float vertical;
    
    // 점프 구현
    public float jumpHeight = 7f;
    private bool isJump;
    private bool jump;
    private bool isGrounded;
    Animator animator;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        animator = GetComponent<Animator>();
    }

    void Update()
    {
        // 매 프레임 입력 받기
        horizontal = Input.GetAxis("Horizontal");
        vertical = Input.GetAxis("Vertical");
        jump = Input.GetButtonDown("Jump");

        if(jump && !isJump)
        {
            CharacterJump();
        }


    }

    private void FixedUpdate()
    {
        CharacterMove();
    }

    public void CharacterJump()
    {  
        if(jump && !isJump)
        {
            animator.SetBool("Jumping", true);
            animator.SetTrigger("Jump");

            rb.AddForce(transform.up * jumpHeight, ForceMode.Impulse);
            isJump = true;
        }
        
        
    }

    // 바닥과의 충돌 감지
    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            animator.SetBool("Jumping", false);
            isJump = false;
        }
    }

    public void CharacterMove()
    {
        // 키 입력 받기
        Vector3 moveInput = new Vector3(horizontal, 0.0f, vertical);

        // 입력 벡터 정규화 및 크기 조정
        if (moveInput.magnitude > 1)
        {
            moveInput = moveInput.normalized;
        }

        // 새로운 위치 계산
        Vector3 newPosition = rb.position + moveInput * moveSpeed * Time.fixedDeltaTime;
        
        // Rigidbody 속도를 0으로 설정하여 미끄러짐 방지
        //rb.velocity = Vector3.zero;
        
        // MovePosition으로 새로운 위치로 이동
        rb.MovePosition(newPosition);
    }
}

 

 

 

 

 

@ 각각 Transition Duration의 수치를 애니메이션에 맞게 세밀조정해서 자연스러운 점프 움직임 구현하기

 

 

 

 

 

 

@ 캐릭터 이동 + 점프 + 애니메이션 + 공중 어택 구현하기

 

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveFixedUpdate : MonoBehaviour
{
    // 이동 구현
    private Rigidbody rb;
    public float moveSpeed = 5f; // 캐릭터 이동 속도
    private float horizontal;
    private float vertical;
    
    // 점프 구현
    public float jumpHeight = 7f;
    private bool isJump;
    private bool jump;
    private bool isGrounded;
    Animator animator;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        animator = GetComponent<Animator>();
    }

    void Update()
    {
        // 매 프레임 입력 받기
        horizontal = Input.GetAxis("Horizontal");
        vertical = Input.GetAxis("Vertical");
        jump = Input.GetButtonDown("Jump");

        CharacterJump();
        JumpAttack();

    }

    private void FixedUpdate()
    {
        CharacterMove();
    }

    public void CharacterJump()
    {  
        if(jump && !isJump) // 키 입력받고 isJump가 false면 아래 코드 진행
        {
            animator.SetTrigger("Jump"); // 점프 스타트 jump start

            animator.SetBool("Jumping", true); // 점프 중 jump air

            rb.AddForce(transform.up * jumpHeight, ForceMode.Impulse); 
            isJump = true; // 점프중
        }
    }

    // 점프 공격
    public void JumpAttack()
    {
        if (Input.GetMouseButtonDown(1)) // 마우스 우클릭
        {
            // 공중에서 떨어지지않고 멈춰서 애니메이션 동작하도록 Kinematic 활성화
            rb.isKinematic = true;
            animator.SetTrigger("JumpAttack"); // 점프 도중 공격

            // 2초뒤 다시 떨어지도록 Kinematic 비활성화
            Invoke("AttackTime", 1.3f);
        }
    }
    
    public void AttackTime()
    {
        // Kinematic 비활성화
        rb.isKinematic = false;
    }

    // 바닥과의 충돌 감지
    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            animator.SetBool("Jumping", false); // 점프 착지 jump landing
            isJump = false; // 점프 끝
        }
    }

    public void CharacterMove()
    {
        // 키 입력 받기
        Vector3 moveInput = new Vector3(horizontal, 0.0f, vertical);

        // 입력 벡터 정규화 및 크기 조정
        if (moveInput.magnitude > 1)
        {
            moveInput = moveInput.normalized;
        }

        // 새로운 위치 계산
        Vector3 newPosition = rb.position + moveInput * moveSpeed * Time.fixedDeltaTime;
        
        // Rigidbody 속도를 0으로 설정하여 미끄러짐 방지
        //rb.velocity = Vector3.zero;
        
        // MovePosition으로 새로운 위치로 이동
        rb.MovePosition(newPosition);
    }
}

 

 

공격 애니메이션에서 Root Trasform Position, Rotation을 체크 및 해제 해가면서 원하는 애니메이션 구현하기.

관련글 더보기