STIKA

D+23일 TIL < Unity 입문 > 본문

프로그래밍/Unity + C#

D+23일 TIL < Unity 입문 >

STIKA 2024. 1. 25. 03:20

24.01.25 Thu

D+23

 

❤️ TIL

Today I Learned

❤️하루에 1%씩만 나아가도 4개월 동안 쌓이면 꽤 덩치가 커진답니다 :)


📌 오늘의 계획

  • 알고리즘 코드카타
  • 입문강의 전부 듣기
  • 팀 프로젝트 작업부분 감잡기

✏️ 작업 내용

✔️ Unity 입문

MonoBehaviour가 자동으로 상속받아짐

오브젝트를 가져와서 연결하려면 무조건 필요

→ 그 외에 용도로 쓴다면 필요 X

우리는 유니티에서 제공되는 함수(유니티 메서드)를 오버라이딩해서 사용
ex) start update fixedupdate

 

 

스크립트 라이프 사이클

게임 오브젝트의 생명 주기 동안 호출되는 특정한 메서드들의 순서와 타이밍

게임 오브젝트의 생성, 초기화, 업데이트, 파괴 등과 관련된 작업을 수행

  1. Awake: 게임 오브젝트가 생성될 때 호출
    주로 초기화 작업으로 이용
  2. Start: 게임 오브젝트가 활성화되고 게임 루프가 시작될 때 호출
    초기 설정 및 시작 작업 수행
  3. Update: 매 프레임마다 호출
    로직의 주요 업데이트
  4. FixedUpdate: 물리 엔진 업데이트 시 호출
    물리적인 시뮬레이션에 관련된 작업을 처리할 때 사용
  5. LateUpdate: Update 메서드 호출 이후에 호출
    다른 오브젝트의 업데이트가 완료된 후에 작업을 수행하는 데 유용
  6. OnEnable: 게임 오브젝트가 활성화될 때 호출
  7. OnDisable: 게임 오브젝트가 비활성화될 때 호출
  8. OnDestroy: 게임 오브젝트가 파괴될 때 호출
    자원 정리 및 해제 작업이 수행

 

유니티의 컴포넌트 방식

→ 게임 오브젝트에 부착되는 기능 모듈

 

기본 컴포넌트 예시

  1. Transform: 게임 오브젝트의 위치, 회전, 크기 등을 조정하는 데 사용
  2. Rigidbody: 물리적인 효과를 게임 오브젝트에 적용
  3. Collider: 충돌 감지를 처리하기 위해 사용
  4. SpriteRenderer: 2D 그래픽을 표시
  5. AudioSource: 사운드를 재생하기 위해 사용
  6. 우리가 만드는 스크립트도 컴포넌트의 역할을 함

 

 

사진의 속성을 보면

sprite Type single인데

파일 하나에 여러개의 스프라이트를 가질수있는데

single이면 하나만 가졌다는것

Pixels Per Unit

PPU = 

(유닛이라는)1이라는 단위안에 몇픽셀을 집어넣을꺼냐

1 유닛 안에 100 pixel을 넣으면 작아지고

1 유닛 안에 16x28pixel을 넣으면 커지고

 

PPU값이 높아질수록 고해상도가 되면서 성능에 문제가 있을수있음

 

Player

부모 Transform

습관가지기 오브젝트를 만들면 Transform리셋

트랜스폼구조 내지 계층구조라고함

부모의 좌표 크기 회전을 다 종속받게됨

실제로 움직이는거는 Sprite가 아니라 부모 Player임

자동차 안에 구현해놓은것들을 자동차를 움직여서 다같이 움직이게끔하는거

 

로컬좌표와 월드좌표

 

월드좌표

세상의 중심으로부터의 나

로컬좌표

내 부모로부터의 나

부모가 어디서 회전하고 얼마나움직이면 그 위치로부터의 나

 

현재는 Player가 월드와 로컬좌표가 같음

MainSprite가 월드와 로컬이 다름 Player로부터의 위치 = 로컬

부모껄 다 따른후 거기서부터

월드에선 2 0 0 인데 MainSprite의 Inspector에선 0 0 0임 부모로부터 안멀어져서

나중에 .position 하면 월드좌표고

.localposition을 해야 로컬좌표를 가져올수있음

스크립트 파일명과 똑같은 클래스이름이 있어야함 이름이 다르면 처리되지 않음

 

void Update()
{
    float x = Input.GetAxisRaw("Horizontal");
    float y = Input.GetAxisRaw("Vertical");

    transform.position += new Vector3(x, y) * Time.deltaTime;
}

캐릭터 이동

- Input.GetAxis -> 0~1로 도달하는값 ->처음에 천천히 출발

- Input.GetAxisRaw -> 0,1,-1로 딱 떨어지는값->같은속도

- Time.deltaTime

 


 0에서 1까지의 값을 input으로 받아오는데
update는 매 프레임 호출됨
근데 유니티에 가서 status를 확인해보면
fps가 300가량이 나옴(1초에 300번 호출)
그니까 1초에 300가량을 움직일수있음

이게 문제가 되는게 컴이 좋고 나쁨에 따라
난 300씩 움직이고
나쁜사람은 100씩움직이고
그래서 사용하는게 deltaTime
이전 프레임과 현재프레임 사이의 시간
이전에서 현재로 도달하는 그 시간
10프레임의 사람 -> 간격(deltatime)인 1/10초를 1초에 10번(fps) = 1
60프레임의 사람 -> 1/60초를 1초에 60번 = 1
이게 델타타임을 곱하는 이유

→ 나중엔 실제시간누적까지도 처리할수있음

 

transform.position += new Vector3(x, y) * speed * Time.deltaTime;

 

이제 속도조절을 하고싶으면

클래스안에 float speed를 주는데 이걸

Inspector안에서 마음대로 바꾸고싶음 

public으로 오픈해버림

외부의 serialize 이렇게 동기화가 됨

 

주의 플레이중에 값을 바꾸면 플레이를 종료하면 초기화됨..

 

근데 public을 안하고싶다 중요한거다

스피드라는 값을 강제적으로 유니티하고 동기화시킴

그래도 같은동작을 함

 

위에건 연습코드

실제로 쓸 inputSystem

package Manager -> unity registry(유니티가 자체적으로 갖고있는) -> inputSystem install

 

OnMoveEvent

OnLookEvent

??? - 질문

걸려있다는 의미를 모르겠음 TopDownMovement 스크립트의 동작방법을 모르겠음

public event Action<Vector2> OnMoveEvent;

event키워드의 의미가 무엇

 OnMoveEvent?.Invoke(direction);

에서 invoke가 하는일

 

 

                                           

TopDownController2D

TopDownCharacterController

PlayerInputController

TopDownMovement

 

TopDownCharacterController

action으로 OnMoveEvent라는걸 만듬 action은 반환하지 않는 델리게이트

OnMoveEvent가 null에서 null이 아니게됐을때 걸어둔 얘들한테 OnMoveEvent에 들어온 값을 다 뿌림?

CallMoveEvent를 부를때 direction을 줌 direction을 가지고 OnMoveEvent를 호출?하는데 여기서 invoke의 의미가 무엇?

대충 playeinput컴포넌트으로 입력을 받아오는데 입력값을 받아오는 조건이 TopDownController2D 를 통해서 정해져 있고

그걸 PlayerInputController에서 처리하는데

PlayerInputController는 TopDownCharacterController로 상속받아져있고

근데 OnMove는 누가 부름?

PlayerInput이? InputValue에서 가져오는건가 했는데

얘는 움직인건지 마우스포지션인지 어케알고 OnmoveOnlook을 골라서 부름..?

TopDownMovement에서

private void Start()
{
    _controller.OnMoveEvent += Move;
}

이건 어케동작하는거지

 

 

                                           

 

inputsystem을 깔고나서

create 맨밑에 input actions를 누르고 이름바꿈

이 액션을 취했을때 돌려받을 값이 Vector2

move → keyboard

look → mouse pos

fire → 왼쪽마우스버튼 클릭 얘만 value any


📝 오늘의 마무리

질의응답이 필요하다..

처음으로 튜터님을 찾아갈예정..


 

✏️ 스스로 어제보다 한 발 더 나아갔다는 것을 자각하기

✏️ TIL을 쓰기 위해서라도, 오늘 반드시 단 하나라도 배우기

✏️ 꾸준히 기록을 남기는 습관 가지기

 

📕 오늘의 학습 키워드

📕  공부한 내용 본인의 언어로 정리하기

📕  오늘의 회고

📕  12시간 중 얼마나 몰입했는지

📕  더 나은 미래를 위해 내일 어떤 공부를 진행할 것인지