유니티 질문 정리

woollim·2024년 10월 25일
1

Unity개념

목록 보기
1/8

■ 2024-10-14

Q1. Vector3에 값 두개만 넣으면 Vector2가 되는 건지, Vector2를 쓰면 안되는 건지 궁금합니다.

  protected float DistanceToTarget()
  {
      return Vector3.Distance(transform.position, ClosetTarget.position);
  }
  • Vector3에 값 두개만 넣는다고 Vector2 값이 되는 거 아님
  • 같은 Z 선상에 있는 것이면 Vector2를 써도 됨. 위 코드는 Vector2 써도 됨

Q2. InputSystem에서 Look 만든데로 입력하면 OnLook 함수가 호출되나요?

  • 함수명이 'On + 설정했던 Actions' 으로 생성 됨
  • Player Input 하단에 보면 쓸 수 있는 함수 이름이 표기되어 있음

Q3. 비주얼 스튜디오에 있는 TextMesh Pro 폴더는 뭔가요?

  • UI 중 TextMesh Pro 가 붙은 UI 를 이용하면 생성됨
  • Legacy UI 보다 성능이 좋다 (Legacy는 업데이트가 종료된 UI)
  • 한글 지원이 안되니 한글을 쓰려면 한글이 포함된 폰트를 추가해야함

Q4. GetComponent는 오브젝트에 직접 추가된 Component랑은 관련없이 가져오는건가요?

  • 같은 오브젝트 Inspector 내에 있는 컴포넌트들을 가져와 쓸때 사용하는 코드
  • gameObject가 생략되어있음. gameObject.GetComponent
  • 같은 오브젝트 내에 있는 컴포넌트를 마찬가지로 같은 오브젝트 내에있는 각기 다른 스크립트가 접근해도 동일한 컴포넌트이다
  • AddComponenet가 새로 생성하는 것. 스크립트 실행 중에 Inspector를 확인하면 해당 컴포넌트가 부착된 것을 확인 할 수 있음
  • GetComponent 에서 "같은 오브젝트" -> "타겟 오브젝트" 로 보는 것이 좋음
  • 평소에는 gameObject 가 생략되어 나의 컴포넌트를 가지고 오는 것이지만, 대상이 있는 경우 해당하는 곳의 컴포넌트에 접근할 수도 있음. ex) targetPlayer.GetComponent().Hp;


Q5. Instantiate()는 어떤 때에 주로 활용되는지 궁금합니다.

  • 개발자가 해당 오브젝트가 몇개가 필요할지 모를 때, 유저 상황에 따라 다른 경우 등
  • 예를 들어 인벤토리(칸), 친구 목록, 참석자 목록


■ 2024-10-17

Q1. 스크립트가 많아지다보니 Awake에서 GetComponent를 했을때 아직 생성되지 않은 컴포넌트여서 null 값이 들어온적이 있습니다.

  • AddComponent를 이용하여 런타임중 컴포넌트를 추가한다면 순서가 꼬이지 않게끔 관리하기 좀 더 편함.


Q2. start에서 변수 초기화를 해도 되는지 궁금합니다.

  • start에서 변수 초기화 가능함.
  • Init 같은 입력 함수들을 만들어서 변수 초기화를 모아놓고, Start 함수에서 호출하면 초기화 순서도 관리 하기 편함 (복잡한 프로젝트나 초기화 순서가 중요한 경우에 유용)

Q3. 게임 데이터를 저장하고 불러오고 싶은데, 유니티에는 어떤 데이터 저장 방법이 있는지 궁금합니다.

  • JSON을 이용할 수 있음
  • using UnityEngine;에는 'PlayerPrefs' 라는 것이 있음, 이걸로 데이터를 저장하고 불러 올 수 있음. 게임(프로그램) 종료후에도 데이터가 보존 됨 (단, 보안에는 취약함)


■ 2024-10-24

Q1. fixedUpdate와 Update 차이

  • Update : 매 프레임마다 호출되며, 프레임 속도에 따라 호출 빈도가 변동될 수 있음. 즉, 게임 성능이 저하되면 호출 주기가 느려질 수 있음 주로 입력 처리나 코루틴 작업 등에 사용되며, 로직 부하가 큰 경우 호출 간격이 유동적일 수 있음

  • fixedUpdate : 고정된 시간 간격으로 호출됨. 물리 연산(예: 충돌 감지)을 처리하는 데 주로 사용됨. 호출 주기가 물리 연산 주기와 일치하지 않으면 충돌이 발생하지 않을 수 있기 때문에, 콜라이더를 충분히 두껍게 설정하여 충돌 가능성을 높이는 것이 중요함.

  • 참고링크


Q2. 유니티에서 쓰레딩 가능 여부

  • 유니티에서 쓰레딩은 여러 방식으로 가능함
  • 코루틴 : 유니티에서 제공하는 기능, 프레임 기반 작업 관리로, 메인 스레드를 점유하며 비동기적으로 작업을 처리함. (자세히보면 비동기적 동기!)
  • Job 시스템 : 유니티에서 제공하는 기능, 유니티의 가상 CPU 코어에서 작업을 처리함. 병렬 처리가 가능해 성능을 향상시킬 수 있음.
  • Task/UniTask (async/await) : C# 비동기 처리 방법을 활용하여 백그라운드 스레드에서 데이터만 처리할 수 있음. 이때, 데이터 전달을 위해 큐(Queue)를 사용하여 작업을 메인 스레드로 전달할 수 있음. 메인 스레드 디스패처는 큐를 통해 데이터를 넣고 빼며 처리하는 역할을 함.


Q3. Time.deltaTime이란?

  • Time.deltaTime은 프레임 간의 시간 차이를 나타내며, CPU 성능과 클럭 속도에 맞춰 1초를 나눔.
  • 예를 들어, 60프레임일 때는 한 프레임의 시간이 약 0.016초가 됨(1/60 = 0.016). 이는 물리 연산이나 애니메이션에서 프레임 속도에 상관없이 일정한 속도로 움직이게 하는 데 사용됨


Q4. 왜 캐릭터 매니저를 사용하나요?

  • 캐릭터 매니저는 게임 내 캐릭터의 데이터를 관리하기 위해 사용됨. 예를 들어, 캐릭터의 장비나 이름, ID 같은 게임의 유지 데이터를 저장하는 용도로 쓰임.
  • 플레이어는 공유 컨테이너로, 각 클래스에서 접근할 수 있음
  • 하지만 자주 메모리에서 접근하면 성능에 부정적 영향을 줄 수 있기 때문에, 메모리 사용을 줄이면서 효율적으로 관리하기 위해 캐릭터 매니저를 사용하는 것이 좋음

0개의 댓글