20230905 내일배움캠프 18일차

Minsang Kim·2023년 9월 5일
0

TIL

목록 보기
18/41

별 볼일 없는 화요일.
그냥 코딩이나 하자.


유니티 리멤버

강의 다 듣고 오늘부터 개인 프로젝트 시작했다. 게더와 비슷한 뭔가를 만들라는데, 이거 멀티 안배우고 만들면 무슨 소용인가 싶어서 그냥 간단한 게임이나 만들자 싶었다. 바로 ㄱㄱ

TileMap

오늘 강의에서 타일 맵이라는 것을 배웠다. 이게 뭐냐 하니 2D 오브젝트에서 말 그대로 타일 맵. 타일로 맵을 만들어주는 그런건가보다. 이걸 이용해서 바닥을 만들고 벽을 만들고, 또 TileMap Collider를 이용해 벽을 통과하지 못하도록 설정할 수도 있었다.
아직 타일이 편한지, 게임 오브젝트가 편한지는 잘 모르겠지만 이런 기능도 있으니 써보면서 익히자.

새로운 Input System

어제 Input System을 배웠더랬지. 오늘 바로 응용해보자.

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

public class PlayerScript : CharacterController
{
    private Camera mainCam;

    [SerializeField] private SpriteRenderer playerRenderer;
    [SerializeField] private Animator playerAnimator;

    [SerializeField] private SpriteRenderer weaponRenderer;
    [SerializeField] private Transform weaponPivot;

    public GameObject bulletObject;
    [SerializeField] private Transform bulletSpawnPoint;

    public float attackCooltime;
    private float attackRecent = 0f;

    private Rigidbody2D rb;
    private float rotZ = 0f;

    private void Awake()
    {
        mainCam = Camera.main;
        rb = GetComponent<Rigidbody2D>();
    }

    private void Start()
    {
        OnMoveEvent += MoveEvent;
        OnLookEvent += LookEvent;
        OnAttackEvent += ShootEvent;
    }

    private void Update()
    {
        mainCam.transform.position = new Vector3(transform.position.x, transform.position.y, -10);
        attackRecent += Time.deltaTime;
    }

    #region MOVE
    public void OnMove(InputValue value)
    {
        Vector2 moveInput = value.Get<Vector2>().normalized;
        playerAnimator.SetBool("IsMoving", (moveInput.magnitude != 0));
        CallMoveEvent(moveInput);
    }

    private void MoveEvent(Vector2 direction)
    {
        rb.velocity = direction * 5;
    }
    #endregion

    #region LOOK
    public void OnLook(InputValue value)
    {
        Vector2 worldPos = mainCam.ScreenToWorldPoint(value.Get<Vector2>());
        Vector2 newAim = (worldPos - (Vector2)transform.position).normalized;

        if (newAim.magnitude >= 0.5f)
            CallLookEvent(newAim);
    }

    private void LookEvent(Vector2 direction)
    {
        rotZ = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
        weaponRenderer.flipY = Mathf.Abs(rotZ) > 90f;
        playerRenderer.flipX = Mathf.Abs(rotZ) > 90f;
        weaponPivot.rotation = Quaternion.Euler(0, 0, rotZ);
    }
    #endregion

    #region SHOOT
    public void OnShoot(InputValue value)
    {
        if (value.isPressed && attackRecent > attackCooltime)
        {
            CallAttackEvent();
            attackRecent = 0f;
        }            
    }

    private void ShootEvent()
    {
        Instantiate(bulletObject, bulletSpawnPoint.position, Quaternion.Euler(0, 0, rotZ - 90));
    }
    #endregion
}

개인 프로젝트에서 사용할 플레이어 스크립트를 작성해봤다. 부모 스크립트인 CharacterController.cs에는 이벤트와 콜하는 메소드만 넣어놓고 PlayerScript.cs에서 기능을 구현했다.

먼저 이벤트를 추가해주고 On이벤트 메소드를 통해 Input System에서 입력을 받아오고 실행하도록 구현했다.


세줄 요약

  • 화요일
  • 강의 생각보다 일찍 다봄
  • 개인 프로젝트 ㄱㄱ
profile
게임만 하다가 개발자로

0개의 댓글