https://gall.dcinside.com/game_dev/108437


๋งํฌ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ž„


์›๋ž˜ ๊ณ ๋„์—”์ง„์œผ๋กœ ๋ณธ์ธ์Ÿ์ด ๋งŒ๋“ค์–ด๋‘”๊ฑฐ ์Šค์ƒท ๋ณด์—ฌ์ฃผ๋ฉด์„œ ์ง„ํ–‰ํ•˜๋ ค๊ณ  ํ–‡๋Š”๋ฐ

์œ ๋‹ˆ๋  API์˜ค๋žœ๋งŒ์— ์—ด์–ด๋ณด๋‹ˆ๊นŒย 

๊ฑ ๋Œ€์ถฉ ์œ ๋‹ˆ๋  API์—์„œ ๋ญ๋ญ ์จ์„œ ์–ด์ผ€์–ด์ผ€ํ•˜๋Š”์ง€ ์ฐ์–ด์ฃผ๋ฉด ๋˜๊ฒŸ๋‹ค ์‹ถ์–ด์„œ ๊ฑ ๊ธ€๋กœ ์”€


1,์บ๋ฆญํ„ฐAnimator์˜ AnimatorController๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•˜๋Š”ย 

AnimatorOverrideController๋ฅผ ๋งŒ๋“ ๋‹ค.


๊ทธ ํ›„ย AnimatorOverrideController์—ย 

๊ฐ๊ฐ์˜ ์บ๋ฆญํ„ฐย ์• ๋‹ˆ๋ฉ”์ด์…˜ ํด๋ฆฝ์— ๋Œ€์‘ํ•˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ํด๋ฆฝ์„ ๋„ฃ์–ด์ค€๋‹ค


2.์บ๋ฆญํ„ฐAnimator์™€ ๋ณ„๋„์˜ย Animatorย ์ปดํฌ๋„ŒํŠธ๋ฅผ ์˜ค๋ธŒ์ ํŠธ์— ๋งŒ๋“ค์–ด์„œ

AnimatorOverrideController๋ฅผ ๋„ฃ์–ด์ค€๋‹ค


3.์˜ค๋ธŒ์ ํŠธAnimator๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•œ๋‹ค.ย 

์šฐ๋ฆฌ๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ดย ์ œ์–ดํ•ด์ค„๊ฑฐ๋ผ์„œ

์ง€ ๋ง˜๋Œ€๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์žฌ์ƒ๋˜๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ


4.์˜ค๋ธŒ์ ํŠธ์— ๋‹ฌ์•„์ค„ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ ๋‹ค.

์ด ์Šคํฌ๋ฆฝํŠธ๋Š”ย ์บ๋ฆญํ„ฐAnimator๋ณด๋‹ค ๋Šฆ๊ฒŒ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—


ExecutionOrder๋ฅผ ์กฐ์ •ํ•˜๋“ ๊ฐ€


์ข€ ์ด๋”ฐ ์ž‘์„ฑํ•  ์žฌ์ƒ ์ฝ”๋“œ๋ฅผ Update๊ฐ€ ์•„๋‹Œ LateUpdate()์—๋‹ค๊ฐ€ ์“ฐ๋˜๊ฐ€ ํ•ด์„œ


์บ๋ฆญํ„ฐAnimator๊ฐ€ ์ž‘๋™ํ•˜๊ณ  ๋‚˜์„œ ์ž‘๋™ ํ•˜๋„๋ก ์กฐ์น˜๋ฅผ ์ทจํ•ด์ค€๋‹ค.


5.Start()ํ•จ์ˆ˜์—์„œ ์บ๋ฆญํ„ฐAnimator์™€ ์˜ค๋ธŒ์ ํŠธAnimator๋ฅผ ์บ์‹ฑํ•œ๋‹ค

๊ฐ๊ฐ charAnimator, objectAnimator๋ผ๋Š” ๋ณ€์ˆ˜๋กœ ์บ์‹ฑํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•จ


6.ํด๋ž˜์Šค์— ๋‹ค์Œ์„ ๋ณ€์ˆ˜๋“ค์„ย ์„ ์–ธํ•ด์ค€๋‹ค

int oldFullPathHashย = 0

float oldTime = 0


7.Update()๋‚˜ LateUpdate()์—ย ์žฌ์ƒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค

์ฐธ๊ณ ๋กœ ๋ณธ์ธ์Ÿ ๋งจ๋‚  ๊ณ ๋„ํ•˜๋А๋ผย ์œ ๋‹ˆ๋  ์•ˆ๊น”์•„๋†”์„œ ๋ฉ”๋ชจ์žฅ์œผ๋กœ ์ฝ”๋”ฉํ• ๊ฑฐ๋ผ

๊ธธ๊ฒŒ์“ฐ๊ธฐ ์‹ซ์–ด์„œ ๋ ˆ์ด์–ด๊ฐ€ ๋‹จ ํ•˜๋‚˜๋ผ๋Š” ๊ฐ€์ • ํ•˜์— ์ž‘์„ฑํ• ๊ฑฐ๋‹ˆ

๋ ˆ์ด์–ด๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋ฉด ์•Œ์•„์„œ ์ผ๋ฐ˜ํ™” ํ•˜์ƒ˜

๋ณ„๋กœ ์–ด๋ ต์ง„ ์•ˆ์„๊ฑฐ์ž„


AnimatorStateInfo stateInfo = charAnimator.GetCurrentAnimatorStateInfo(0)


int currentFullPathHash = stateInfo.fullPathHash

float currentTime = stateInfo.normalizedTime * stateInfo.length


//์บ๋ฆญํ„ฐAnimator๊ฐ€ ์žฌ์ƒ์ค‘์ธ state๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋ฉด

if (oldFullPathHash != currentFullPathHash){

ย  ย  //์˜ค๋ธŒ์ ํŠธAnimator๋„ ํ•ด๋‹น state์žฌ์ƒ

ย  ย  charAnimator.PlayInFixedTime(currentFullPathHash, 0, currentTime)

ย  ย  //์• ๋‹ˆ๋ฉ”์ด์…˜ ์ฆ‰์‹œ ์ ์šฉ

ย  ย  charAnimator.Update(0f)

}

//์บ๋ฆญํ„ฐAnimator๊ฐ€ ์žฌ์ƒ์ค‘์ธ state๊ฐ€ ๊ทธ๋Œ€๋กœ๋ผ๋ฉด

else{

ย  ย  //์บ๋ฆญํ„ฐAnimator๊ฐ€ ์žฌ์ƒํ•œ ๋งŒํผ ์˜ค๋ธŒ์ ํŠธAnimator๋„ ์žฌ์ƒ

ย  ย  charAnimator.Update(currentTime - oldTime)

}



oldFullPathHash = currentFullPathHash

oldTime = currentTime


๋


๋งํ–‡๋“ฏ์ด ide๋„์›€ ์•ˆ๋ฐ›๊ณ  ๋ฉ”๋ชจ์žฅ์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ 

ํ…Œ์ŠคํŠธ๋„ ์•ˆํ•ด๋ฐ”์„œ ๊ทธ๋Œ€๋กœ ๊ฐ–๋‹ค ๋ณต๋ถ™ํ–‡์„๋•Œ ์ž‘๋™์„ ๋ณด์žฅํ•˜์ง€ ์•ˆ์Œ


๋ณธ์ธ์Ÿ์€ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ํ–‡์—‡์Šด


ํ•ต์‹ฌ์€ Animator์˜ Update()ํ•จ์ˆ˜์ž„

์ด๊ฑด ์œ ๋‹ˆ๋  ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” Update()ํ•จ์ˆ˜๋ž‘์€ ์™„์ „ํžˆ ๋ณ„๊ฐœ๋‹ˆ๊นŒย 

ํ–‡๊ฐˆ๋ฆฌ์ง€๋งˆ์ƒ˜


Animator.Update(int deltaTime)๋Š” ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ

ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” "์ฆ‰์‹œ" ํ˜„์žฌย ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ธด

deltaTime๋งŒํผ ์žฌ์ƒ์‹œํ‚ค๊ณ ย 

์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ž์ฒด๋ฅผ ์ ์šฉ์‹œ์ผœ์ฃผ๋Š”๊ฑฐ์ž„


์šฐ๋ฆฌ๊ฐ€ Animator.Play()๋ฅผ ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋ฐ”๋กœ ์ ์šฉ๋˜์ง€ ์•Š์Œ.

Play()๋ฅผ ํ•˜๋ฉด,

์žฌ์ƒํ•˜๋ ค๋Š” State๋งŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ค์ œ ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์ ์šฉ์€ ๋‹ค์Œํ”„๋ ˆ์ž„์— ๋ฐœ์ƒํ•จ

๊ทผ๋ฐย Animator.Update(int deltaTime)๋ฅผ ์“ฐ๋ฉด ๋ฐ”๋กœ ์ ์šฉ๋จ

์ด๋ฅผ ์ด์šฉํ•ด์„œ ๋‘ ์• ๋‹ˆ๋ฉ”์ดํ„ฐ๊ฐ„์˜ ์‹ฑํฌ๋ฅผ ์™„๋ฒฝํ•˜๊ฐœ ๋งž์ถ”๋Š”๊ฒŒ ๊ฐ€๋Šฅํ•œ๊ฑฐ์—์˜ค์˜ค์˜ค์˜ค


์˜ˆ์ƒ์งˆ๋ฌธ : Transition์ค‘์—๋Š” ์ œ๋Œ€๋กœ ์ž‘๋™ ์•ˆํ• ๊ฑฐ ๊ฐ™์€๋ฐ?

๋‹ต๋ณ€ : ๊ทธ๊ฑด...๋‹˜์ด...์•Œ์•„์„œ...ํ•ด์•ผ๋Ž€....


์˜ˆ์ƒ์งˆ๋ฌธ2 : BlendTree์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ ์•ˆํ• ๊ฑฐ ๊ฐ™์€๋ฐ?

๋‹ต๋ณ€:ย ๊ทธ๊ฑด...๋‹˜์ด...์•Œ์•„์„œ...ํ•ด์•ผ๋Ž€....


๊ทธ์น˜๋งŒ ์งˆ๋ฌธ์ž๋Š” ์Šค์ผˆ๋ ˆํ†ค์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์•ˆ์“ฐ๋‹ˆ๊นŒ Transition๋„ BlendTree๋„ ์“ธ ์ผ์ด

์—…์ง€ ์•ˆ์„๊ฐ€????


์•„๋‹˜๋ง๊ตฌ