์˜ค๋Š˜์€ GamePiece Move๋ฅผ ์ž‘์—…ํ•ด๋ดค๋‹ค.ย 

์ข€๋” ๊น”๋”ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ์‹œ๋„ํ•˜๋‹ค๊ฐ€ ์˜ค๋Š˜ ํ•˜๋ฃจ ์‹œ๊ฐ„์ด ๋‹ค ๊ฐ„๋“ฏ ์‹ถ๋‹ค.


05b2de23fcd139ab2eed86e7449c756c65165aad5a6096a18f089753ea79ab496001f2b329700ae2d0dfce3a63


GamePieceMoveSystem ์—์„œ Job์„ ์ƒ์„ฑํ•˜๊ณ ย ScheduleParallel๋กœ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ์—์„œ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ–ˆ๋‹ค.

ย  ย  [BurstCompile]

ย  ย  public void OnUpdate(ref SystemState state)

ย  ย  {

ย  ย  ย  ย  var ecbSingleton = SystemAPI.GetSingleton<BeginSimulationEntityCommandBufferSystem.Singleton>();

ย  ย  ย  ย  var ecb = ecbSingleton.CreateCommandBuffer(state.WorldUnmanaged);

ย  ย  ย  ย  var deltaTime = SystemAPI.Time.DeltaTime;


ย  ย  ย  ย  var gamePieceMoveJob = new GamePieceMoveJob

ย  ย  ย  ย  {

ย  ย  ย  ย  ย  ย  ECB = ecb.AsParallelWriter(),

ย  ย  ย  ย  ย  ย  DeltaTime= deltaTime,

ย  ย  ย  ย  };


ย  ย  ย  ย  gamePieceMoveJob.ScheduleParallel(movePieceQuery, state.Dependency);

ย  ย  }


Job ๋‚ด์šฉ์€ ๋งค์šฐ ๊น”๋”ํ•˜๋‹ค. ๊ตฌํ˜„ ๋ถ€๋ถ„์„ IAspect์—์„œ ์ฒ˜๋ฆฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


[WithAll(typeof(IsMoveData))]

[BurstCompile]

partial struct GamePieceMoveJob : IJobEntity

{

ย  ย  public EntityCommandBuffer.ParallelWriter ECB;

ย  ย  public float DeltaTime;


ย  ย  void Execute([ChunkIndexInQuery] int chunkIndex, PieceMoveAspect pieceMove)

ย  ย  {

ย  ย  ย  ย  pieceMove.MoveGamePiece(chunkIndex, ECB, DeltaTime);

ย  ย  }

}


IApect์—์„œ ์ด๋™์— ๋Œ€ํ•œ ๊ตฌํ˜„์„ ํ–ˆ๋‹ค. IAspect๊ฐ€ 1.0 ๋ฒ„์ „์— ์ƒˆ๋กœ ์ƒ๊ธด๊ฑด๋ฐ ์ฒ˜์Œ์—๋Š” ๋‚ฏ์„  ๊ธฐ๋Šฅ์ด๋ผ ๋ถˆํŽธํ•˜๊ณ  ์ด๊ฑธ ์™œ ๋งŒ๋“ค์—ˆ์„๊นŒ ์‹ถ์—ˆ๋Š”๋ฐ ์™„์ „ ์‹ ์„ธ๊ณ„๋‹ค. ์ด๋…€์„ ๋•๋ถ„์— ์ฝ”๋“œ ์ตœ์ ํ™”๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋œ๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„๋ฅผ ๋Šฅ์ˆ™ํ•˜๊ฒŒ ํ•˜์ง€ ๋ชปํ•ด ํ•ญ์ƒ ์ฝ”๋“œ๊ฐ€ ๊ฐœํŒ์ธ ๋‚˜์—๊ฒŒ DOTS๋Š” ์œ ๋‹ˆํ‹ฐ๊ฐ€ ์ค€ ์„ ๋ฌผ์ด๋‚˜ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค.ย ย 


ย  ย  public void MoveGamePiece(int chunkIndex, EntityCommandBuffer.ParallelWriter ECB, float DeltaTime)

ย  ย  {

ย  ย  ย  ย  var Destination = new float3(Coord.x, Coord.y, 0);


ย  ย  ย  ย  if (math.distance(Destination, transform.Position) > 0.1f)

ย  ย  ย  ย  {

ย  ย  ย  ย  ย  ย  var direction = Destination - transform.Position;

ย  ย  ย  ย  ย  ย  transform.Position += math.normalize(direction) * DeltaTime * BoardData.GAME_PIECE_MOVE_SPEED;

ย  ย  ย  ย  }


ย  ย  ย  ย  else

ย  ย  ย  ย  {

ย  ย  ย  ย  ย  ย  transform.Position = Destination;

ย  ย  ย  ย  ย  ย  ECB.SetComponentEnabled<IsMoveData>(chunkIndex, Entity, false);

ย  ย  ย  ย  }

ย  ย  }


์œ ๋‹ˆํ‹ฐ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๊ณต๋ถ€ํ•œ ๋น„์ „๊ณต์ด๋ผ ๋‚ด ์ฝ”๋“œ์— ์ž์‹ ์ด ์žˆ์ง„ ์•Š๋‹ค. DOTS๋„ ๊ณต๋ถ€์ค‘์ด๋ผ ์Œ.. ์ด๊ฑฐ๋ณด๋‹ค ๋” ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ์žˆ์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค. ๊ณ„์† ํฌ๋Ÿผ๊ฐ€์„œ ์™ธ๊ตญ์ธ๋“ค ์ด์•ผ๊ธฐํ•˜๋Š”๊ฑฐ ๋ณด๋ฉด์„œ ํŒ์„ ์–ป์–ด๋‚ด๊ณ  ๋ฌผ์–ด๋ณด๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋‹ค. ์œ ๋‹ˆํ‹ฐ API์— ์˜ˆ์ œ ์ฝ”๋“œ ์ข€ ๋„ฃ์–ด์คฌ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค. ๋”ธ๋ž‘ ๊ตฌ์กฐ๋งŒ ์ ์–ด๋†“๊ณ  ์„ค๋ช…์ด ์—†๋Š” ๊ฒƒ๋„ ๋งŽ๊ณ  ใ…  ๊ณ ์ˆ˜๋“ค์€ ๊ทธ๊ฑฐ๋ณด๋ฉด์„œ ์–ด๋–ป๊ฒŒ ๊ณต๋ถ€ํ•˜๋Š”๊ฑด์ง€ ์‹ ๊ธฐํ•  ๋ฟ์ด๋‹ค;

์•”ํŠผ DOTS๋Š” ์žฌ๋ฏธ๋‚˜๋‹ค.ย 


ย