2번째 프로젝트가 끝나고 3번째 프로젝트가 시작되는 날이다
유니티 입문에 해당되는 1주일 간의 강의를 듣고 개인 과제를 제출하고 다음 1주일에는 새로운 팀원들과 팀 프로젝트를 한다.
처음 유니티 입문 강의를 들은 소감은 "어렵다"였다 사전 캠프에서 유니티에 대한 강의를 조금 들은 바가 있어서 알아먹기 정도는 할 줄 알았는데 시간이 지났다고 머리가 포멧 된것 같다.
**게임 오브젝트**
요소 (컴포넌트) = 게임 오브젝트를 구성하는 부품//트랜스폼 스프라이트렌더러
스프라이트 렌더러 = 2d 이미지를 보여줌
리지드 바디 = 중력(강체물리)
필수 요소(트랜스 폼) = 위치, 크기, 회전
게임 오브젝트는 트랜스 폼을 이용한 부모 자식관계를 가짐
에셋 = 게임에 필요한 모든 리소스 이미지, 사운드, 모델
리지드 바디 // constraints = 제약
빌드하기 => 게임 파일 만들기?
=============
TopDown Shooting 게임 만들기
단계는 강의 자료 => 프로젝트 개요 참조
메인 시스템과 서브 시스템으로 이루어짐
Time.deltaTime
이전프레임부터 현재 프레임까지의 경과 시간
InputManager의 문제점
여러 입력장비의 대응이 힘들다
입력 처리와 실제 로직 실행 주체를 분리가 필요하다(단일 책임 원칙)
Collider = 충돌감지를 가능하게 한다
여러종류의 Collider가 있으며 사각, 구형, 복합 형태가 존재한다
Rigidbody = 게임 오브젝트에 물리법칙을 부여해준다
한쪽이라도 Rigidbody가 있어야 충돌을 Collider가 감지한다
*충돌 발생시*
OnCollisionEnter, OnCollisionStay, OnCollisionExit 등의 이벤트를 발생시킨다 2D는 뒤에 2D를 붙여야함
이 이벤트는 스크립트에서 처리하여 원하는 기능을 실행 할수 있다
ex)
오브젝트가 땅에 닿으면 점프 가능 상태로 변경하거나 오브젝트가 플레이어와 충돌하면 데미지를 입히는 등의 기능 구현 가능 // 매우 중요
OnTrigger는 충돌이 아니라 확인수순
===============================================
강의 도중 작성하신 코드에 대한 설명
캐릭터와 몬스터의 공통적인 기능을 넣는곳이 TopDownController 액션을 등록하고 Invoke로 호출해준다
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerInputController : TopDownController
{
private Camera camera;
private void Awake()
{
camera = Camera.main; // 메인 카메라 태그가 붙어있는 카메라를 가져온다
}
public void OnMove(InputValue value)
{
Vector2 moveInput = value.Get<Vector2>().normalized;
CollMoveEvent(moveInput);
// 실제 움직이는 처리는 여기서 하지 않고 PlayerMovement에서 한다
}
public void OnLook(InputValue value)
{
Vector2 newAim = value.Get<Vector2>(); // 마우스 포지션 기준이기때문에 노말 라이징을 하지 않는다
Vector2 worldPos = camera.ScreenToWorldPoint(newAim); // 월드 좌표계를 가지고 온다
newAim = (worldPos - (Vector2)transform.position).normalized;
CollLookEvent(newAim);
}
}
OnMove함수는 방향 값이나 마우스 위치 값을 Nomalized해주기 위한 매서드, Invoke하기 전에 전처리 과정을 담은 매서드다
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TopDownController : MonoBehaviour
{
//액션들을 만들어놓는다
//무브먼트가 발생시 액션이 발동하도록 등록한다
// 이벤트라는 키워드를 이용
public event Action<Vector2> OnMoveEvent; // action의 특징은 무조건 void만 반환 아니면 func를 사용해야한다
public event Action<Vector2> OnLookEvent;
public void CollMoveEvent(Vector2 direction)
{
OnMoveEvent?.Invoke(direction); // ?. = 없으면 말고 있으면 실행한다
}
public void CollLookEvent(Vector2 direction)
{
OnLookEvent?.Invoke(direction);
}
}
using System;
using UnityEngine;
public class TopDownMovement : MonoBehaviour
{
// 여기가 실제로 이동이 일어날 컴포넌트
private TopDownController controller;
private Rigidbody2D movementRigidbody;
private Vector2 movementDirection = Vector2.zero;
private void Awake()
{
//Awake는 주로 내 컴포넌트 안에서 끝나는 것들
// controller랑 TopDownMovement랑 같은 게임 오브젝트에 있다라는 가정
controller = GetComponent<TopDownController>();
movementRigidbody = GetComponent<Rigidbody2D>();
}
private void Start()
{
controller.OnMoveEvent += Move;
}
private void Move(Vector2 direction)
{
movementDirection = direction;
}
private void FixedUpdate()
{
//fixeUpdate는 물리 업데이트에 관련이 있다.
//Rigidbody의 값을 바꾸니까 FixedUpdate
ApplyMovement(movementDirection);
}
private void ApplyMovement(Vector2 direction)
{
direction = direction * 5;
movementRigidbody.velocity = direction;
}
}
'개발의 시작 TIL(Today I Learned)' 카테고리의 다른 글
개발의 시작 TIL(Today I Learned) 세번째 프로젝트 4일차 (0) | 2024.10.11 |
---|---|
개발의 시작 TIL(Today I Learned) 세번째 프로젝트 2일차 (3) | 2024.10.08 |
개발의 시작 TIL(Today I Learned)두번째 프로젝트 7일차 (2) | 2024.10.04 |
개발의 시작 TIL(Today I Learned)두번째 프로젝트 5일차 (0) | 2024.10.02 |
개발의 시작 TIL(Today I Learned)두번째 프로젝트 4일차 (2) | 2024.10.01 |