농작물을 받아라 !! - 1P, 2P (Unity)

장민제·2025년 5월 7일

내일배움캠프

목록 보기
19/41
post-thumbnail

🥕 농작물을 받아라 !!

메타버스 미니게임 추가로 농작물을 받아라 !! 라는 게임을 만들어보았다.
떨어지는 농작물을 캐릭터를 움직여 받으면 되는 게임으로
로컬로 동작하는 1P, 2P를 만들어 2명이서 할 수 있도록 만들고자 하였다.

🎮 1P, 2P 만들기

먼저 어떻게 따로 동작하게 만들까라는 생각에서 나온 것은 바로 InputSystem 이었다.
각 플레이어의 InputActions을 만들어 주고 움직이게 하였다.

1P InputActions

2P InputActions

1P는 키보드 A, D, W (점프)
2P는 방향키 ←, →, ↑ (점프) 로
InputActions를 만들어 주었다.

BaseController.cs

using UnityEngine;

public class BaseController : MonoBehaviour
{
    protected Rigidbody2D _rb;
    [SerializeField] protected SpriteRenderer spriteRenderer;

    protected Vector2 movementDirection = Vector2.zero;
    public Vector2 MovementDirection { get => movementDirection; }

    protected Vector2 lookDirection = Vector2.zero;
    public Vector2 LookDirection { get => lookDirection; }

    protected AnimationController animationController;
    protected StatController statController;
	
    ... 생략
    
    protected virtual void Update()
    {
        Rotate(lookDirection);
    }

    protected virtual void FixedUpdate()
    {
        Movement(movementDirection);
    }

	void Movement(Vector2 direction)
    {
        direction *= statController.Speed;

        _rb.velocity = direction;
        animationController.Move(direction);
    }

    void Rotate(Vector2 direction)
    {
        float rotZ = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
        bool isLeft = Mathf.Abs(rotZ) > 90;

        spriteRenderer.flipX = isLeft;
    }
}

FarmPlayerController.cs

using UnityEngine;
using UnityEngine.InputSystem;

public class FarmPlayerController : BaseController
{
    [SerializeField] private float jumpForce = 20f;
    private bool isJump = false;
    private bool isGround = false;

    public void Init()
    {
        statController.Speed = 5f;
    }

    protected override void Start()
    {
        base.Start();

        Init();
    }

    void OnMove(InputValue inputValue)
    {
        movementDirection = inputValue.Get<Vector2>();
        movementDirection = movementDirection.normalized;
        lookDirection = movementDirection;
    }

    void OnJump(InputValue inputValue)
    {
        isJump = inputValue.isPressed;
    }

    protected override void FixedUpdate()
    {
        base.FixedUpdate();

        if (isJump && isGround)
        {
            _rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
            isJump = false;
        }
    }
}

💻 실제 동작

잘 작동하는 것을 확인할 수 있다.
이렇게 InputSystem을 활용하여 간단하게 1P, 2P 캐릭터를 구현해보았다. 😁

profile
Unity, C#

0개의 댓글