[Unity] Project. fall_3

Lingtea_luv·2025년 4월 29일

Project

목록 보기
12/38
post-thumbnail

Project. fall


4/29 작업 내역

  1. 게임 오브젝트(Map Objects, Tile, Player) 에셋, 텍스쳐 적용
  2. 플레이어 이동 모션 구현
  3. 게임 매니저, 데이터 매니저, UI 매니저 구현
  4. 인게임 씬, 로비 씬 구현

Player 구현

Move()

이동 관련한 이슈가 없었기에 특별히 추가한 부분은 없고, 애니메이션 작업할 때 플레이어의 시선이 이동방향으로 가는 것이 자연스러워보여 해당 부분을 추가할 필요가 있다.

public class PlayerControllerLSW : MonoBehaviour
{
    [SerializeField] float moveSpeed;
    [SerializeField] private Rigidbody rb;

    private Animator animator;

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


    private void FixedUpdate()
    {
        Move();
    }


    private void Move() 
    {
        float moveX = Input.GetAxis("Horizontal");
        float moveZ = Input.GetAxis("Vertical");

        Vector3 front = new Vector3(moveX, 0f, moveZ).normalized;

        float moveAmount = new Vector2(moveX, moveZ).magnitude;
        animator.SetFloat("Forward", moveAmount);
        
        if (front != Vector3.zero) 
        {
            Vector3 camForward = Camera.main.transform.forward;
            Vector3 camRight = Camera.main.transform.right;

            camForward.y = 0f;
            camRight.y = 0f; 
            camForward.Normalize();
            camRight.Normalize(); 

            Vector3 moveDir = camForward * front.z + camRight * front.x; 
            rb.AddForce(moveDir * moveSpeed, ForceMode.Force);
        }
    }

Jump()

점프 관련해서 하나 이슈가 있다면 원래 isGround 체크를 OnCollisionExit에서 진행했는데, 타일을 여러개 이어붙였기에 하나의 타일을 벗어날 때마다 OnCollisionExit이 호출되어 isGround가 false로 설정돼, 점프가 간헐적으로 되지 않는 이슈가 있었다. 따라서 isGroundJump() 호출시 false로 설정하여 무한 점프를 막고, 해당 이슈를 해결했다.

public class PlayerControllerLSW : MonoBehaviour
{    
    [SerializeField] float fallMultiplier = 2.5f;
    [SerializeField] float jumpForce;
    private bool isGround;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space) && isGround)
        {
            Jump();
        }
        else
        {
            animator.SetBool("Jump", false);
        }

        if (rb.velocity.y < 0)
        {
            rb.velocity += Vector3.up * Physics.gravity.y * (fallMultiplier - 1) * Time.deltaTime;
        }
    }
    
    private void Jump()
    {
        rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        animator.SetBool("Jump", true);
        
        isGround = false;
        animator.SetBool("OnGround", false);
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
		{
            isGround = true;
            animator.SetBool("OnGround", true);
        }
    }
}

Animator

플레이어에 에셋을 적용시키고 모션을 추가하기 위해서는 Animator 컴포넌트를 사용해야한다. 이후 Animator의 파라미터를 추가하고 각 상황 별로 멤버 함수에서 파라미터의 값을 할당하여 모션 변경 조건을 설정한다.

public class PlayerControllerLSW : MonoBehaviour
{
    private Animator animator;
    
    private void Start()
    {
    	// Animator 컴포넌트 가져오기
        animator = GetComponent<Animator>();
    }
    
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space) && isGround)
        {
            Jump();
        }
        else
        {
        	// 점프하고 있지 않으면 "Jump" 파라미터 false로 설정
            animator.SetBool("Jump", false);
        }
    }
    
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
		{
        	// 땅에 닿아있을 때 "OnGround" 파라미터 ture로 설정
            animator.SetBool("OnGround", true);
        }
    }
    
    private void Move() 
    {
    	// 이동하고 있을 때 = moveAmount > 0 일 때 
        // Forward > 0.1 과 같은 조건으로 Idle에서 Run으로 모션 변경
    	float moveAmount = new Vector2(moveX, moveZ).magnitude;
        animator.SetFloat("Forward", moveAmount);
    }
    
    private void Jump()
    {
    	// 점프할 때 파라미터 값 설정
        animator.SetBool("Jump", true);
        animator.SetBool("OnGround", false);
    }
}

이렇게 설정하고 나서 인스펙터의 Animator상에서 모션을 연결하고 모션 전환 조건을 추가해주면 이동할 때, 가만히 있을 때, 점프할 때의 모션 전환이 매끄럽게 가능하다.

Scene 흐름도

profile
뚠뚠뚠뚠

0개의 댓글