• 티스토리 홈
  • 프로필사진
    개양반
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
개양반
  • 프로필사진
    개양반
    • Everybody Happyvirus (87)
      • Unity DOTS (19)
        • ECS Sample Projtect (8)
        • Unity.Physics (1)
        • TIP (9)
      • Unity Assets 추천 (6)
        • BG Database (5)
        • I2 Localization - 현지화 (1)
      • Unity 자습서 (15)
        • Addressable (4)
        • 유니티 + 파이어베이스 (0)
        • GamingServices (10)
      • 주식 이야기 (4)
        • 회사 소개 (2)
        • 회사 정보 (1)
        • 실적 발표 (0)
      • 일상 생활 (9)
        • 도서리뷰 (2)
        • 제품리뷰 (6)
      • 게임일기 (2)
        • 리그오브레전드 (2)
      • 게임소개 (4)
      • 게임리뷰 (7)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • UNITY DOTS - Unity.Mathematics.Random 랜덤 사용하기
        2022년 11월 28일
        • 개양반
        • 작성자
        • 2022.11.28.:57

        1. 개요

        DOTS에서는 Random 값을 얻을려면 Unity.Mathematics 패키지에 있는 Random을 사용해야 한다. 하지만, 기존의 UnityEngine.Random 처럼 사용하면 모든 Entity가 같은 랜덤 값을 생성하는  문제가 발생한다. 

        같은 Seed를 가진 Entity는 같은 랜덤값을 생성한다.

        해결 방법으로는 Entity가 개별 Seed를 가지고 있으면 된다.

         

        2. 예제

        2-1 ComponentData

            public struct RandomScoreData : IComponentData
            {
                // Entity는 고유한 Ramdom Component를 가져야 한다.
                public Random Randomizer; 
            }

         

        2-2 Authoring

            public class RandomScoreAuthoring : MonoBehaviour
            {
                public float randomTime;
        
                class RandomPositionBaker : Baker<RandomScoreAuthoring>
                {
                    public override void Bake(RandomScoreAuthoring authoring)
                    {
                        AddComponent(new RandomScoreData
                        {
                            Randomizer = new Random((uint)UnityEngine.Random.Range(0, int.MaxValue)),
                        });
                    }
                }
            }

        2-2-1 설명

        게임오브젝트가 BakeSystem을 통해 Entity로 변환될 때 Random Component를 랜덤한 Seed로 생성한다. 동일한 Seed를 가지면 동일한 랜덤값을 생성한다.

         

        2-3 System

            [BurstCompile]
            public partial struct RandomScoreSystem : ISystem
            {
                [BurstCompile]
                public void OnCreate(ref SystemState state)
                {
                    
                }
        
                [BurstCompile]
                public void OnDestroy(ref SystemState state)
                {
                    
                }
        
                [BurstCompile]
                public void OnUpdate(ref SystemState state)
                {
                    var deltaTime = SystemAPI.Time.DeltaTime;
        
                    new RandomPositionJob
                    {
                    }.ScheduleParallel();
                }
            }
        
            [BurstCompile]
            public partial struct RandomPositionJob : IJobEntity
            {
                public void Execute([ChunkIndexInQuery] int chunkIndex, ref RandomScoreData randomScoreData, ref TransformAspect transform)
                {
                    Debug.Log(string.Format("Random Score: {0}", randomScoreData.Randomizer.NextInt(0, int.MaxValue)));
                   
                   // 시드를 다시 할당
                   randomScoreData.Randomizer = new Random((uint)randomScoreData.Randomizer.NextInt(0, int.MaxValue));
                
                }
            }

        2-3-1 설명

        BurstComplie 에서는 String을 사용할 수 없다. string.Format을 이용해서 디버그를 찍어야 한다. 

         

        3. 결과

        Seed가 다르면 랜덤값도 다르게 생성된다.

         

        저작자표시 비영리 변경금지 (새창열림)

        'Unity DOTS > TIP' 카테고리의 다른 글

        UNITY DOTS TIP - ComponentData를 세분화 해라  (0) 2022.12.01
        UNITY DOTS - JobHandle.CombineDependencies  (0) 2022.11.29
        UNITY DOTS - 거리 계산하기  (0) 2022.11.25
        Unity DOTS(ECS) 에서 Build 하는 방법  (1) 2022.08.09
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바