게임엔진

    [Unity] Range 어트리뷰트를 단위로 설정할 수 있는 방법

    아래는 어트리뷰트를 그려줄 클래스 using UnityEngine; using UnityEditor; using System; [CustomPropertyDrawer(typeof(RangeExAttribute))] internal sealed class RangeExDrawer : PropertyDrawer { private int value; /** * Return exact precision of reel decimal * ex : * 0.01 = 2 digits * 0.02001 = 5 digits * 0.02000 = 2 digits */ private int Precision(float value) { int _precision; if (value == .0f) return 0; _precisi..

    [Unity] 화면 위치 > 월드 좌표 치환 RectTransformUtility

    public static bool ScreenPointToLocalPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam, out Vector2 localPoint); ScreenPoint(스크린좌표)를 RectTransform의 LocalPoint(캔버스좌표)로 변환합니다. Camera의 매개 변수는 ScreenPoint(스크린 좌표)와 연관된 카메라이어야 한다. 캔버스에서 RectTransform이 Screen Space-Overlay 모드로 설정된 경우 cam 매개 변수는 null 이어야 한다. (그래서 EnemyHpBar 구현할 때 없어도 됐던 것이었다.) rect screenPoint를 출력할 Canvas의 RectTransfo..

    [Unity] UI 카메라 설정하기 (screen space - camera)

    메인 카메라(main camera)의 culling mask에서 UI를 체크해제하고 depth 속성의 값을 0으로 설정하였다. 씬에 새로운 카메라를 추가한다. 카메라의 clear flags에서 depth only를 선택하고 culling mask에서 UI 레이어를 제외하고 체크해제한다. 캔버스와 하위 ui 요소의 레이어를 설정한다(UI) render mode에서 screen space- camera를 선택하고 render camera에 씬에 추가한 카메라를 참조시킨다. 메인 카메라에서 씬의 게임 오브젝트와 스카이박스를 표시하고 두번째 카메라의 UI는 항상 위에 표시된다. 출처 : 유니티에서 UI 카메라 설정하기(screen sapce - camera) (tistory.com)

    [Unity] Job 시스템 이해 2, NativeContainer

    ● NativeContainer ▶ Unity에 Job 시스템은 멀티 스레드 사용 편하게 만들었지만, 일반적으로 Job의 데이터가 메인 스레드에서 접근할 수 없는 메모리에 만들어진다는 단점이 있다. ▶ 메인 스레드에서 Job의 데이터에 접근하기 위해서는 NativeContainer라는 특수한 공유 메모리 타입을 사용해야만 한다. ● NativeContainer Type ▶ NativeArray : Unity에 내장된 기본적인 Job 시스템에서 사용하는 NativeContainer Type으로 Array와 유사하다. ※ 하단의 NativeContainer Type은 ECS에서 제공하는 NativeContainer Type으로 Package Manager를 통해 Collections을 Import해야지만 사..

    [Unity] Job 시스템 이해 1, IJob

    Unity의 Job 시스템을 이용하기 위해서는 using Unity.Jobs 를 사용해야 한다. 해당 게시글에서는 Unity.Jobs의 코드 확인 및 샘플 프로젝트를 만들어 봄으로써 Job 시스템을 이해하고자 한다. [ Unity.Jobs 의 계층 구조 ] ● Interface IJob ▶ 단일 작업을 하는 Job을 구현 할 때, struct에 상속하는 interface [JobProducerType( typeof( IJobExtensions.JobStruct ) )] public interface IJob { // // 요약: // Implement this method to perform work on a worker thread. void Execute(); } Execute() 함수에 Job에서 ..

    [Unity] Serializable Dictionary - 인스펙터에 노출시킬 수 있는 딕셔너리

    using System.Collections; using System.Collections.Generic; using UnityEngine; namespace AT.SerializableDictionary { [System.Serializable] public class SerializableDictionary : Dictionary, ISerializationCallbackReceiver { [SerializeField] private List keys = new List(); [SerializeField] private List values = new List(); // save the dictionary to lists public void OnBeforeSerialize() { keys.Clear..

    [Unity] onClick.AddListener에서 함수의 파라미터 전달 문제

    1) 예에서 아래와 같이 캔버스에 버튼을 구성하였다. 2) 아래 스크립트의 for구문에서 순차적으로 버튼을 클릭했을때 호출되는 함수를 추가하고 함수에 전달하는 인수로 iteration 변수를 설정하였다. 3) 게임을 시작하고 순차적으로 버튼을 클릭하면 의도한 iteration 변수를 출력하지않는것을 확인할수있다. 4) for 구문 내에서 임시적으로 정수형 변수를 선언하고 이 변수를 인수로 전달한다. 5) 게임을 시작하고 순차적으로 버튼을 클릭하면 정상적으로 출력한다. 출처 : 유니티 onClick.AddListener에서 함수의 파라미터 전달 문제 (tistory.com)

    [Unity] 안드로이드 플러그인 사용해보기

    우선 안드로이드 프로젝트를 만든다 empty Activity 또는 No Activity로 설정한다 다음 화면이다. 여기서 주의해야 할 것은 Minimum SDK 이다. 그 이유는 유니티에서도 Minimum SDK를 설정하는데 안드로이드 Minimum과 유니티 Minimum이 일치하지 않으면 오류가 생기게 된다. 유니티 프로젝트가 성공적으로 생성되고 gradle 파일들도 성공적으로 빌드되었다면 File -> New -> New Module로 들어가 모듈을 생성 해준다. 타입은 Android Library로 선택 모듈이 생성되면 androidTest, test 파일들이 같이 있으면 중복으로 오류가 생길 수도 있으므로 지워주자. 생성된 모듈에 클래스를 생성해주자. 일단 test_String으로 생성. 아래의 ..

    [Unreal] Construction Script

    블루프린트 내의 각각의 인스턴스에 다양성을 줄 수 있는 스크립트. 게임 내 레벨을 구축하거나, 블루프린트 내의 프로퍼티를 업데이트 할 때 등등을 구현한다. 블루프린트 인스턴스 생성시 컴포넌트 리스트 다음에 실행되는 부분이다. 따라서 블루프린트 인스턴스에서 필요한 초기화 작업을 할 수 있다. 블루프린트와 관련된 가장 최신의 정보를 제공 같은 블루프린트로 만든 인스턴스라도 이 Construction Script 을 통해 인스턴스마다 개별적인 특성을 부여할 수 있다. 이 Construction Script 안에서 각각의 인스턴스마다 다르게 부여할 프로퍼티들을 public 변수로 에디터에서도 열고 에디터에서 각각의 인스턴스마다 이 변수 값들을 설정하게 한 후 이를 Setting 하는 작업을 한다. 2 개의 변수..

    [Unity] 강체(RigidBody) AddForce에 대한

    정의 Rigidbody에서 엄청 많이 쓰이는 AddForce를 알아보자 2가지 형태가 있다. public void AddForce(Vector3 force, ForceMode mode = ForceMode.Force); public void AddForce(float x, float y, float z, ForceMode mode = ForceMode.Force); 쉽게 말하면 AddForce(방향*힘 값, 힘의 종류) 라고 보면 된다. AddForce는 Rigidbody에게 힘을 전달해준다. (하지만 모든 Rigidbody가 아닌 Active 상태일 때만 전달된다.) **이러한 Force calculation은 FixedUpdate() 때 이루어진다. using UnityEngine; // 이것을 쓰지..