원본: https://github.com/Unity-Technologies/EntityComponentSystemSamples/blob/master/DOTS_Guide/ecs_tutorial/README.md

타입들의 접근성

이 튜토리얼에서는 모든 클래스(class)와 구조체(struct)를 내부로 만드는 관례를 따릅니다. 내부 타입 또는 멤버 변수들은 동일한 어셈블리의 파일 내에서만 액세스할 수 있으며, 이는 C#의 기본 접근성 수준입니다.
여러 어셈블리에 걸쳐 분할된 대규모 프로젝트에서 작업할 때는 명시적인 접근성 수정자가 필요합니다. 이에 대해 논의하는 것은 이 튜토리얼의 범위를 벗어나며, 어떤 식으로든 DOTS에만 국한되지 않습니다.

블로그 이미지

RIsN

,

원본:
https://blog.unity.com/technology/enter-play-mode-faster-in-unity-2019-3

Baking을 통해 데이터 변환

Baking은 Editor(데이터 작성: authoring data)의 GameObject 데이터를 Entity Scenes(런타임 데이터: runtime data)에 기록된 엔티티로 변환하는 시스템을 제공합니다.
Baking은 여러 단계로 나뉘지만, 그 핵심에는 두 가지 핵심 단계가 있습니다: Baker와 Baking Systems.
점진적 Baking(Incremental Baking)은 Sub Scene이 열려 있고 작성 개체(authoring objects)를 편집할 때도 발생합니다. ECS는 사용자가 변경한 내용을 감지하고 이 변경으로 인해 다시 실행해야 하는 베이커의 최소량을 식별합니다. 이 결과는 편집 모드 및 재생 모드 중에 편집기의 엔티티 월드에 패치됩니다.

Baker 클래스

Baker 클래스를 사용해서 컴퍼넌트 작성(authoring components)과 같이 Unity 개체와 직접 상호작용 할 수 있습니다. Baker들은 또한 의존성이 암묵적으로 또는 명시적으로 파일화(혹은 점유? Captured)되는 곳이며, 베이커가 다시 실행될 경우 추가된 모든 구성 요소가 자동으로 되돌아갈 수 있습니다. Baker는 Baking 중인 기본 엔티티와 자체적으로 생성된 추가 엔터티에만 컴퍼넌트를 추가할 수 있습니다.
예:

public class MyMonoBehaviour : MonoBehaviour
{
   public float value;
}

public class MyBaker : Baker<MyMonoBehaviour>
{
   public override void Bake(MyMonoBehaviour authoring)
   {
       AddComponent(new MyComponent {Value = authoring.value} );
   }
}

Baker에서 다른 데이터 소스에 접근하기

점진적 Baking(Incremental Baking)이 계속 작동하려면 Baker에서 GameObject를 변환하는 데 사용되는 데이터를 추적해야 합니다. 작성 컴퍼넌트(authoring component)의 모든 필드가 자동으로 추적되고 해당 데이터가 변경되면 베이커가 다시 실행됩니다.
다른 작성 컴퍼넌트(authoring component)의 정보는 자동으로 추적되지 않으므로 추적하려면 해당 구성요소에 종속성을 추가해야 합니다. 이렇게 하려면 게임 오브젝트에서 제공하는 기능 대신 Baker가 제공하는 기능을 사용하여 다른 구성 요소에 액세스 해야 합니다:

public struct MyComponent : IComponentData
{
   public float Value;
}

public class MyMonoBehaviour : MonoBehaviour
{
   public GameObject otherGO;
}

public class MyBaker : Baker<MyMonoBehaviour>
{
   public override void Bake(MyMonoBehaviour authoring)
   {
       var transform = GetComponent<Transform>(authoring.otherGO);
       AddComponent(new MyComponent {Value = transform.position.x} );
   }
}

마찬가지로 에셋(asset)에서 데이터에 액세스하는 경우 해당 자산에 대한 종속성을 생성해야 하므로 에셋(asset)이 변경되면 Baker가 다시 실행됩니다.

public struct MyComponent : IComponentData
{
   public int Value;
}

public class MyMonoBehaviour : MonoBehaviour
{
   public Mesh mesh;
}

public class MyBaker : Baker<MyMonoBehaviour>
{
   public override void Bake(MyMonoBehaviour authoring)
   {
       // We want to rebake if anything changes in the mesh itself
       DependsOn(authoring.mesh);
       AddComponent(new MyComponent { Value = authoring.mesh.vertexCount } );
   }
}

Baker 안의 프리팹(Prefabs)

Prefabs를 선언하고 변환시키려면, Baker 안에 GetEntity를 부르면 됩니다:

public struct MyComponent : IComponentData
{
   public Entity Prefab;
}

public class MyMonoBehaviour : MonoBehaviour
{
   public GameObject prefab;
}

public class MyBaker : Baker<MyMonoBehaviour>
{
   public override void Bake(MyMonoBehaviour authoring)
   {
       AddComponent(new MyComponent { Prefab = GetEntity(authoring.prefab) } );
   }
}

GetEntity는 엔티티 Prefab을 만드는 데 사용된 엔티티를 반환하지만 이 시점에서는 변환되지 않았습니다. 이것은 나중에 별도의 패스에서 발생합니다.

Baking 시스템

Baking 시스템은 베이커가 생산하는 결과를 처리하는 정규 systems 입니다. 예를 들어 결과를 결합하는 등. 즉, Baking 시스템은 엔티티 데이터로만 작동해야 하며 게임 오브젝트 및 컴퍼넌트와 같이 관리되는 작성 유형(authoring types)으로는 작동하지 않아야 합니다. 이는 Baking 시스템이 Burst 및 Jobs을 사용하여 데이터를 처리할 수 있음을 의미하기도 합니다.
Baking 시스템을 만들려면 [WorldSystemFilter(WorldSystemFilterFlags.BakingSystem)] 특성을 표시합니다. 이것은 Baking이 그것들을 발견하고 Baking 월드에 그것들을 추가할 수 있게 해줍니다. Baking 시스템은 모든 Baking 패스에서 업데이트됩니다.

[WorldSystemFilter(WorldSystemFilterFlags.BakingSystem)]
partial class BakingOnlyEntityAuthoringBakingSystem : SystemBase
{
   protected override void OnUpdate()
   {
      // … Your code here …
   }
}

Bakers는 일반적으로 필요하지만, Baking 시스템은 선택 사항이며 고급 사용 사례에만 필요합니다.


블로그 이미지

RIsN

,

원본: https://blog.unity.com/technology/enter-play-mode-faster-in-unity-2019-3

관련 항목

Unity 2019.3에서 더 빨리 Play 모드로 들어가세요.

Play 모드는 Unity를 즐겁게 만드는 핵심 요소입니다. 그러나 프로젝트가 복잡해지면서 시작하는 데 시간이 걸릴 수 있습니다. Play 모드로 들어가고 나갈 수 있는 속도가 빠를수록 변경 사항을 더 빨리 수정하고 테스트할 수 있습니다. 그렇기 때문에 실험적인 기능으로 Unity 2019.3 beta 에서 설정 가능한 Enter Play Mode를 도입하고 있습니다.

현재 Editor에서 Play Mode(재생 모드)를 시작하면, Unity는 스크립팅 상태(도메인 다시 로드)를 재설정하고 씬(scene)을 다시 로드하는 두 가지 작업을 수행합니다. 이 작업은 시간이 걸리고, 프로젝트가 복잡해질수록 재생 모드에서 새로운 변경 사항을 테스트하기 위해 더 오래 기다려야 합니다. 그러나 Unity 2019.3 beta부터는 "도메인 다시 로드" 및 "씬 다시 로드" 작업 중 하나 또는 둘 다를 비활성화할 수 있습니다.

테스트 결과에 따르면, 프로젝트에 따라 대기 시간을 최대 50-90%까지 절약할 수 있습니다.

 

 

우리는 AA 타이틀(Production title), 우리의 FPS 샘플, 메가시티, 그리고 빈 프로젝트로 구성 가능한 플레이 모드를 테스트 했습니다. 그래프는 편집기가 재생 모드로 전환하는 데 걸린 시간(초)을 나타냅니다. 해당 숫자가 작을수록 좋습니다.

File > Project Settings > Editor에서 Enter Play Mode Options를 활성화하면 Domain을 다시 로드하고 Scene을 다시 로드하는 옵션을 사용할 수 있습니다. 좀 더 상세한 내용을 원하면 어떻게 플레이 모드를 설정하나?를 확인하세요.

 

이 옵션을 사용하면 코드 변경이 없을 때 플레이 모드 시작 프로세스에서 Domain 및/또는 Scene 다시 로드를 비활성화할 수 있습니다. 플레이 모드에 들어가기 전에 게임 상태를 재설정하려면 API와 Callback을 통해 이 기능에 액세스할 수도 있습니다.

아래 표는 도메인 리로드 및 Scene 리로드를 비활성화 하기 전과 후의 플레이 모드 시작 프로세스를 보여 줍니다:

 

Unity가 플레이 모드로 전환할 때 수행하는 프로세스에 대한 자세한 내용은 문서를 참조하십시오.

이 기능은 현재 실험적이며 모든 Unity 패키지들이 비활성화된 도메인 및 Scene 리로드와 함께 작동하도록 검증되지는 않습니다. 문제가 생기면 포럼에서 알려주세요!

도메인 리로드를 사용하지 않도록 설정한 경우 스크립트를 올바르게 수정하는 방법

보시다시피 도메인 리로드를 방지하는 것은 매우 간단하지만 비용이 많이 듭니다. 플레이 모드가 시작될 때 스크립트 상태가 올바르게 재설정 되도록 스크립트의 정적 필드 및 정적 이벤트 핸들러를 조정해야 합니다.

다음 코드 예제에는 플레이어가 점프 버튼을 누를 때 올라가는 카운터가 있습니다. 도메인 리로드가 활성화된 경우, 플레이 모드로 들어갈 때 카운터가 자동으로 0으로 재설정 됩니다. 도메인 리로드를 사용하지 않도록 설정한 후에는 카운터가 재설정 되지 않고 값이 플레이 모드에 있거나 플레이 모드에서 해제됩니다. 즉, Editor에서 프로젝트의 두 번째 실행에서 카운터가 이전 실행에서 변경된 경우 카운터가 0이 아닐 수 있습니다.

public class StaticCounterExample : MonoBehaviour
{
    // 도메인 리로드를 사용하지 않도록 설정한 경우 이 카운터가 0으로 재설정 되지 않습니다.
	static int counter = 0;

	// Update is called once per frame
	void Update()
	{
    	if (Input.GetButtonDown("Jump"))
    	{
        	counter++;
        	Debug.Log("Counter: " + counter);
    	}
	}
}

[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] 특성을 사용하고, 값을 명시적으로 재설정하여 도메인 리로드가 비활성화된 경우 카운터가 올바르게 재설정되도록 합니다. 예:

using UnityEngine;

public class StaticCounterExampleFixed : MonoBehaviour
{
	static int counter = 0;

	[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
	static void Init()
	{
    	Debug.Log("Counter reset.");
    	counter = 0;
	}

	// 프레임당 한 번씩 업데이트가 호출됩니다.
	void Update()
	{
    	if (Input.GetButtonDown("Jump"))
    	{
        	counter++;
        	Debug.Log("Counter: " + counter);
    	}
	}
}

도메인 리로드를 사용 불가능으로 설정한 후 플레이 모드를 종료할 때 Unity는 정적 이벤트 핸들러에서 메서드 등록을 취소하지 않습니다. 정적 이벤트 핸들러에 메서드를 등록하는 코드가 있는 경우 이로 인해 문제가 발생할 수 있습니다. 예를 들어, Editor에서 프로젝트의 첫 번째 Play(재생)에서 메소드는 정상으로 등록됩니다. 그러나 프로젝트의 두 번째 재생에서는 이러한 메소드가 첫 번째 메소드 외에 두 번째로 등록되므로 이벤트가 발생할 때 두 번 호출됩니다.

다음 코드는 정적 이벤트 핸들러에 Application.quitting을 등록합니다:

using UnityEngine;
public class StaticEventExample : MonoBehaviour
{
	void Start()
	{
    	Debug.Log("Registering quit function");
    	Application.quitting += Quit;
	}

	static void Quit()
	{
    	Debug.Log("Quitting!");
	}
}

도메인 리로드를 사용하지 않도록 설정한 경우 위의 예에서는 플레이 모드에 들어갈 때마다 '종료' 메서드를 다시 추가합니다. 이렇게 하면 플레이 모드를 종료할 때마다 "종료" 메시지가 추가로 표시됩니다.

[RuntimeInitializeOnLoadMethod] 특성을 사용해, 메서드를 두 번 추가하지 않도록 명시적으로 등록 취소합니다:

using UnityEngine;
public class StaticEventExampleFixed : MonoBehaviour
{
	[RuntimeInitializeOnLoadMethod]
	static void RunOnStart()
	{
    	Debug.Log("Unregistering quit function");
    	Application.quitting -= Quit;
	}

	void Start()
	{
    	Debug.Log("Registering quit function");
    	Application.quitting += Quit;
	}

	static void Quit()
	{
    	Debug.Log("Quitting the Player");
	}
}

 

우리의 문서에서 도메인 리로드가 비활성화 된 경우 올바르게 수행되도록 스크립트를 수정하는 방법에 대한 자세한 내용을 참조하십시오.

Asset Store

인기 있는 Asset Store packages가 비활성화된 도메인 및 Scene 리로드와 함께 작동하는지 확인하려고 합니다. 프로젝트에서 발생하는 문제를 Asset packages의 게시자에게 보고하여 도움을 받을 수 있습니다.

Join Unity 2019.3 beta!

현재 프로젝트가 플레이 모드로 전환되는 속도가 느린 경우 이 기능을 사용하면 작업 속도가 상당히 빨라질 것으로 생각됩니다. Unity 2019.3 beta에 가입하여 사용해 보십시오. 포럼에서 귀하의 의견을 들을 수 있기를 기대합니다! 이 기능은 실험적이기 때문에 사용자의 요구에 맞게 구성하는 데 도움이 될 수 있습니다. 우리는 특히 당신이 마주치는 문제에 대해 듣기를 고대하고 있습니다.

이미 이 기능을 테스트하고 귀중한 피드백을 제공함으로써 전체 커뮤니티를 도와준 포럼 사용자 @Sini, @chrisk, @Peter77 및 @Baste에게 큰 감사를 드립니다.

블로그 이미지

RIsN

,

원본: https://github.com/Unity-Technologies/EntityComponentSystemSamples/blob/master/DOTS_Guide/ecs_tutorial/README.md

변환 설정

베이킹 파이프라인(baking pipeline)을 적절히 설정

이 튜토리얼의 나머지 부분에서는 Preferences > Entites의 "Scene View Mode" 항목이 "Runtime Data"로 되어 있다고 가정합니다:


블로그 이미지

RIsN

,

원본: https://github.com/Unity-Technologies/EntityComponentSystemSamples/blob/master/DOTS_Guide/ecs_tutorial/README.md

프로젝트 설정

새 프로젝트를 만들고, 필요한 패키지를 설치하고, 설정을 조정.

  1. 3D(URP) 템플릿을 사용하여 Unity Hub에 새 프로젝트를 만듭니다. 템플릿을 사용해 본 적이 없으면 결국 다운로드해야 합니다. 올바른 에디터 버전을 사용하고 있는지 확인해주세요.
  2. 프로젝트가 로드되면 "URP Empty Template" 인스펙터에서 "Remove Readme Assets" 단추를 클릭합니다. 이렇게 하면 이 자습서에 필요하지 않은 "Assets/TutorialInfo" 폴더가 제거됩니다. 이 인스펙터는 기본적으로 선택되어 있어야 하지만 혹시 선택되지 않았다면 프로젝트 창에서 Assets/Readme.asset를 선택합니다.
  3. 이 튜토리얼에서는 패키지 하나만 명시적으로 설치해야 합니다. 다른 패키지는 종속되어 프로젝트에 포함됩니다. Window > Package Manager로 이동하여 왼쪽 상단의 + 버튼을 클릭하고 "Add package by name"을 선택합니다. "Name" 필드를 "com.unity.entities.graphics"으로 설정하고 "Version" 필드를 비워둔 다음 "Add" 버튼을 클릭하고 패키지와 종속 패키지가 설치될 때까지 기다립니다.
  4. Edit > Project Settings > Editor에서 "Enter Play Mode Options"을 사용 가능으로 설정하고, 하위 선택사항 중 "Reload ___" 관련은 선택하지 않은 상태로 둡니다. 이러한 옵션의 기능에 대한 자세한 내용은 다음 링크를 참조 해주세요.
    이러한 설정이 static 필드(블로그 게시물 등 참조)의 사용에 미치는 영향에 주의 해주세요.
  5.  
  6. 프로젝트 창에서 Assets 폴더의 다음 목록에서 누락된 폴더를 생성 해주세요.
    • Prefabs
    • Scenes (already created)
    • Scripts/Aspects
    • Scripts/Authoring
    • Scripts/Components
    • Scripts/MonoBehaviours
    • Scripts/Systems
    • Settings (already created)

블로그 이미지

RIsN

,

원본: https://github.com/Unity-Technologies/EntityComponentSystemSamples/blob/master/DOTS_Guide/ecs_tutorial/README.md

명령어 사용 및 제공된 코드 사용

이 튜토리얼의 인라인 코드에 관한 설명.

이 문서의 모든 코드 토막은 참조 프로젝트에서 자동으로 추출되고, 코드 토막을 포함하는 전체 파일의 사용 명령어가 복사됩니다. 따라서 명령어가 도입되는 시점에 아직 필요하지 않은 명령어를 사용하게 됩니다.

또한 UnityEngine 유형을 명시적으로 참조하는 방법에 주의하십시오. 이것은 이 튜토리얼에서 고전적인 유니티 유형과 DOTS 관련 유형을 명확하게 설명하기 위해 사용되는 규칙입니다.

일부 파일은 전체적으로 제공되며, 일부 파일은 기존 파일을 수정한 것으로 이 경우에는 + 줄(녹색)이 추가되고 - 줄(빨간색)이 제거되며, 다른 줄은 변경되지 않고 코드 토막만 제공합니다.

마지막으로 제공된 소스 파일을 복사할 때 코드의 주석을 읽으십시오. 이러한 설명에는 각 단계의 목적에 대한 많은 중요한 정보가 포함되어 있으며 이 튜토리얼의 필수적인 부분입니다.

블로그 이미지

RIsN

,

원본: https://github.com/Unity-Technologies/EntityComponentSystemSamples/blob/master/DOTS_Guide/ecs_tutorial/README.md

필요한 유니티 버전

이 튜토리얼은 2022.2.0b8을 사용했습니다.

Unity Hub 자체의 Unity 릴리스 목록에서 해당 버전(또는 최신 패치 릴리스)을 찾습니다.
"설치"(왼쪽 메뉴) → "에디터 설치"(오른쪽 위), "사전 릴리스"(탭).

또는, 다음의 링크에서 유니티 에디터의 2022.2.0b8 버전을 수동으로 다운로드 할 수도 있습니다:

블로그 이미지

RIsN

,

해결: Editor 클래스를 Editor 폴더에 넣어 놓으면 사라지는 에러

발생장소: apk 빌드 시

블로그 이미지

RIsN

,

에셋 주소 : Utage3

  • Utage3에서 기본적으로 사용하는 텍스트 아웃라인(외곽선) 스크립트
    • 기본 유니티의 아웃라인은 변경해서 사용하는 형식
  • Utage3가 아닌 기본적인 텍스트에서도 해당 사용할 수 있음
블로그 이미지

RIsN

,
  1. Image 오브젝트 생성
  2. 거기에 Animator와 Animation을 추가
  3. Animation에 Sprite 파츠를 전부 추가
블로그 이미지

RIsN

,