별 볼일 없는 화요일.
그냥 코딩이나 하자.
강의 다 듣고 오늘부터 개인 프로젝트 시작했다. 게더와 비슷한 뭔가를 만들라는데, 이거 멀티 안배우고 만들면 무슨 소용인가 싶어서 그냥 간단한 게임이나 만들자 싶었다. 바로 ㄱㄱ
오늘 강의에서 타일 맵이라는 것을 배웠다. 이게 뭐냐 하니 2D 오브젝트에서 말 그대로 타일 맵. 타일로 맵을 만들어주는 그런건가보다. 이걸 이용해서 바닥을 만들고 벽을 만들고, 또 TileMap Collider
를 이용해 벽을 통과하지 못하도록 설정할 수도 있었다.
아직 타일이 편한지, 게임 오브젝트가 편한지는 잘 모르겠지만 이런 기능도 있으니 써보면서 익히자.
어제 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에서 입력을 받아오고 실행하도록 구현했다.