์ €๋… ๋จน๊ณ  ๊ธ€์“ฐ๋А๋ผ ์กฐ๊ธˆ ๋Šฆ์—ˆ์Œ.


์•„๋ž˜์— ๋ณด์„ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ถ๊ธˆํ•ดํ•˜๋Š” ๋ถ„์ด ์žˆ์–ด์„œ ์˜ฌ๋ฆผ


1.์›๋ž˜๋Š” ํŒŒํ‹ฐํด ์“ฐ๋ ค๊ณ  ํ–ˆ์—ˆ๊ณ , ์จ ๋ดค๋Š”๋ฐ, ์œ ๋‹ˆํ‹ฐ์—์„œ๋Š” ํŒŒํ‹ฐํด ์ž…์ž ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ์ฝ”๋“œ๋กœ ์กฐ์ •ํ•˜๋Š” ๊ถŒํ•œ์ด ๊ต‰์žฅํžˆ ๋งŽ์ด ์ œํ•œ๋˜์–ด ์žˆ์Œ.


๋ณด์„์„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ๋จน๋„๋ก ํ•˜๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ




viewimage.php?id=2abcdd23dad63db0&no=29bcc427b28677a16fb3dab004c86b6fae7cfdc6a7b48ad83da3c1d4383a9e9b2ec121aa77599a4d2c0e9b5661e71d02f722d0e06af1a0507fbf




์œ„์™€ ๊ฐ™์ด ํฉ๋ฟŒ๋ ค์ง„ ํ›„ ์ž ์‹œ ๋ฉˆ์ถ”๊ณ , ํ”Œ๋ ˆ์ด์–ด์—๊ฒŒ ํŒŒํ‹ฐํด ์ž…์ž ํ•˜๋‚˜์”ฉ ์ž์„์ฒ˜๋Ÿผ ๋‹ฌ๋ผ๋ถ™๋„๋ก ํ•˜๋ ค๋‹ˆ ์ข€...๋งŽ์ด ๊ทธ์ง€๊ฐ™์•˜์Œ.ย 


์œ ๋‹ˆํ‹ฐ์—์„œ ํŒŒํ‹ฐํด ์•ˆ์— ์žˆ๋Š” ์†๋„, ๋ฐฉํ–ฅ, ๊ธฐํƒ€ ๋“ฑ๋“ฑ ์˜จ๊ฐ– ๋ชจ๋“ˆ๋“ค์— ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌ์กฐ๊ฐ€ ๋˜์–ด ์žˆ์–ด์„œย 


๊ฒฐ๊ตญ ํฌ๊ธฐํ•˜๊ณ  ๋ณด์„ ์ž…์ž ํ”„๋ฆฌํŒน์„ ๋งŒ๋“ค์–ด์„œ ์ง์ ‘ ์ดํŽ™ํŠธ๋ฅผ ๋ฟœ๋„๋ก ํ•ด๋ฒ„๋ ธ์Œ.


2. ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ˆœ์„œ๋ฅผ ๊ธ€๋กœ ๋ฌ˜์‚ฌํ•˜๋ฉด


A.ํŒŒํ‹ฐํด์ด ์›ํ˜•์œผ๋กœ ๋ฟœ์–ด์ ธ ๋‚˜์˜จ๋‹ค


B.์ผ์ • radius์— ๋„๋‹ฌํ•œ ์ž…์ž๋Š” ์„œ์„œํžˆ ๋ฉˆ์ถ˜๋‹ค.


C.๋ณด์„์ด ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๋”ฐ๋ผ๊ฐ„๋‹ค.


D.ํ”Œ๋ ˆ์ด์–ด์™€ ๋ถ€๋”ชํžˆ๋ฉด ๋ณด์„์„ ๋จน๋Š”๋‹ค


๊ฐ€ ๋ ํ…Œ๊ณ , ์ด๋ ‡๊ฒŒ ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰๋˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ๊ฒฝ์šฐ ์ฝ”๋ฃจํ‹ด์„ ์ด์šฉํ•˜๋Š”๊ฒŒ ํŽธํ•จ.


๊ทธ๋ž˜์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ๋Œ์•„๊ฐ


IEnumerator dropGems(int gemCount)

{

int bigGemCount = gemCount / GarlicGlobalSettings.GlobalSettings.bigGemHoldAmount;

int gemLeftCount = (gemCount - bigGemCount * GarlicGlobalSettings.GlobalSettings.bigGemHoldAmount);

int smallGemCount = gemLeftCount / GarlicGlobalSettings.GlobalSettings.smallGemHoldAmount;

ย 

for(int i = 0; i < bigGemCount; i++)

{

gems.Add(spawnGem(burstCircleRadius, true));

}

for (int i = 0; i < smallGemCount; i++)

{

gems.Add(spawnGem(burstCircleRadius, false));

}

ย 

effectBegun = true;

yield return new WaitForSeconds(pauseFirstBurstTime);

ย 

stopAllChips();

ย 

yield return new WaitForSeconds(pausingTime);

ย 

//emitParticlesByVelocity(particleSystem, Vector2.zero);

ย 

float deltaTime = 0;

while (deltaTime < chipFollowPlayerTimeLimit)

{

deltaTime += Time.deltaTime;

particlesFollowTarget(chipCollideTarget);

checkOverlap(chipCollideTarget);

yield return null;

}

ย 

yield break;

}


->์•„์ดํ…œ์„ Dropํ•˜๋Š” ItemBurstManager๋ผ๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ๊ณ , ์—ฌ๊ธฐ์„œ ๋‚ด๊ฐ€ ๋ฟœ์–ด๋‚ด๊ณ  ์‹ถ์€ gem์˜ ๊ฐœ์ˆ˜(gemCount)๋ฅผ ๋ฐ›์•„ ๋ณด์„์„ ํฉ๋ฟŒ๋ฆฌ๋Š” ์ฝ”๋“œ.


spawnGem()์„ ํ˜ธ์ถœํ•˜๋ฉด์„œ ๊ฐ Gem Object์— ๋Œ€ํ•ด, ์ดˆ๊ธฐํ™”์‹œ ๋žœ๋คํ•˜๊ฒŒ ๋ฐฉํ–ฅ๊ณผ ์†๋„๋ฅผ ์„ค์ •ํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ์Œ. ๊ทธ๋ž˜์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ๋จ.


GemInfo spawnGem(float radius, bool isBigGem)

{

float randomAngle = Random.Range(0, 360f);

float randomRadius = Random.Range(0, radius);

Vector2 vect = new Vector2(transform.position.x + randomRadius * Mathf.Cos(randomAngle * Mathf.Deg2Rad),ย 

transform.position.y + randomRadius * Mathf.Sin(randomAngle * Mathf.Deg2Rad));

ย 

GameObject obj = null;

if(isBigGem)

{

obj = ObjectPoolingManager.Instance.GetObject(gemBigPrefab.name);

}

else

{

obj = ObjectPoolingManager.Instance.GetObject(gemSmallPrefab.name);

}

obj.transform.position = new Vector3(vect.x, vect.y, transform.position.z);

//obj.GetComponent<Renderer>().material.color = burstColor;

ย 

Vector2 burstDirection = (vect - (Vector2)transform.position).normalized;

float speed = Random.Range(burstSpeedMin, burstSpeedMax);

obj.GetComponent<ChipCustomPhysics>().currentVelocity = burstDirection * speed;

ย 

return obj.GetComponent<GemInfo>();

}


vect ๊ตฌํ•˜๋Š” ๋กœ์ง์ด ์–ด๋ ค์›Œ ๋ณด์ผ ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ทธ๋ƒฅ ์› ์•ˆ์—์„œ Gem์ด ์Šคํฐ๋  ์œ„์น˜๋ฅผ ๋žœ๋คํ•˜๊ฒŒ ๊ตฌํ•˜๋Š” ๊ฒƒ ๋ฟ์ž„. (๋‚˜์ค‘์— ์•Œ์•˜๋Š”๋ฐ ์œ ๋‹ˆํ‹ฐ์—์„œ Random.insideUnitCircle ์ด๋ผ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์ž‡์—ˆ๋‹ค...)


๊ทธ ์ดํ›„ ์›์˜ ์ค‘์‹ฌ(์ด ๊ฒฝ์šฐ์—๋Š” gem ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ถ€๋ชจ ์˜ค๋ธŒ์ ํŠธ์˜ ์œ„์น˜)์— ๋”ฐ๋ฅธ burstDirection์„ ๊ตฌํ•˜๊ณ , ์†๋„ ์„ค์ • ํ›„ ๋.


์นฉ์˜ ์†๋„์— ๋”ฐ๋ผ ์›€์ง์ด๋Š” ๋กœ์ง์€ ์ปค์Šคํ…€์œผ๋กœ ๋ฌผ๋ฆฌ ์—ฐ์‚ฐ์„ ๊ตฌํ˜„ํ•จ. ๋ง์ด ์ปค์Šคํ…€ ๋ฌผ๋ฆฌ ์—ฐ์‚ฐ์ด์ง€ ์กด๋‚˜ ์‰ฌ์›€. ์ด๊ฒŒ ์ „๋ถ€์ž„.


public class ChipCustomPhysics : MonoBehaviour

{

public Vector2 currentVelocity;

// Update is called once per frame

void Update ()

{

transform.position += (Vector3)(currentVelocity * Time.deltaTime);

}ย 

}


๊ฑ velocity ์„ค์ •ํ•œ๊ฑฐ์— ๋”ฐ๋ผ deltatime ๊ณฑํ•ด์„œ ์ด๋™๊ฑฐ๋ฆฌ ๊ตฌํ•˜๋ฉด ๋. ๊ณ ๋“ฑํ•™๊ต ๋ฌผ๋ฆฌ ์‹œ๊ฐ„์— ๋ฐฐ์šด s=vt ์•Œ์ง€? v๋Š” currentVelocity๊ณ  t๋Š” Time.deltaTime์ž„.


3. ๋‹ค์‹œ dropGems๋กœ ๋Œ์•„๊ฐ€๋ฉด, ์ด๋ ‡๊ฒŒ ์นฉ์ด ๋ฟœ์–ด์ ธ ๋‚˜์˜ค๋‹ค๊ฐ€ pauseFirstBurstTime์ด ์ง€๋‚˜๋ฉด stopAllChips()๋ฅผ ํ˜ธ์ถœํ•ด ์นฉ์˜ ์†๋„๋ฅผ ๋–จ์–ดํŠธ๋ฆผ. ๋‚˜๋Š” ์ด๋ ‡๊ฒŒ ํ–ˆ์Œ.


void stopAllChips()

{

foreach(GemInfo chip in gems)

{

if(chip != null)

{

chip.gameObject.GetComponent<ChipCustomPhysics>().currentVelocity *= 0.3f;

}

}ย 

ย }


์†๋„๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•ด๋ฒ„๋ฆฌ๋‹ˆ ์ข€ ๋ถ€์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฉˆ์ถ”๋”๋ผ๊ตฌ. ๊ทธ๋ž˜์„œ ๊ทธ๋ƒฅ ์†๋„์— 0.3 ๊ณฑํ•ด์„œ ์ฒœ์ฒœํžˆ ๊ฐ€๋„๋ก ๋งŒ๋“ฌ.


๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ pausingTime์ด ์ง€๋‚˜๊ณ  ๋‚˜๋ฉด ์นฉ๋“ค์ด ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๋”ฐ๋ผ๋‹ค๋‹ˆ๊ธฐ ์‹œ์ž‘ํ•จ.ย 


while๋ฌธ์„ ๋Œ๋ฉด์„œ particlesFollowTarget ํ•จ์ˆ˜์—์„œ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๋”ฐ๋ผ๋‹ค๋‹ˆ๊ณ , ๋งŒ์•ฝ ํ”Œ๋ ˆ์ด์–ด์™€ ๊ฒน์น˜๋ฉด checkOverlap ๋‚ด์—์„œ gem์„ ํš๋“ํ•˜๋ฉด์„œ ์‚ฌ๋ผ์ง€๋„๋ก ๊ตฌํ˜„ํ–ˆ์Œ.


4.particlesFollowTarget์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ–ˆ์Œ


void particlesFollowTarget(GameObject target)

{

if(target == null)

{

return;

}

for (int i = 0; i < gems.Count; i++)

{

ChipCustomPhysics physics = gems[i].GetComponent<ChipCustomPhysics>();

ย 

Vector2 particleToPlayerVector = (target.transform.position - gems[i].transform.position).normalized;

physics.currentVelocity += particleToPlayerVector * 5f;

physics.currentVelocity *= 0.9f;

}ย 

ย }


์ข€ ๊ทผ๋ณธ์—†๋Š” ์ฝ”๋“œ์ธ๋ฐ, gem์—์„œ ํ”Œ๋ ˆ์ด์–ด๊นŒ์ง€ ๋ฐฉํ–ฅ์„ ๊ตฌํ•œ ํ›„์— ํŒŒํ‹ฐํด ์ด๋™ ์†๋„์—์„œ ํ”Œ๋ ˆ์ด์–ด๊นŒ์ง€์˜ ๋ฐฉํ–ฅ ๋…ธ๋ง๋ฒกํ„ฐ(๊ธธ์ด๊ฐ€ 1์ธ ๋ฒกํ„ฐ)๋ฅผ ๋”ํ•œ ํ›„ ๊ธธ์ด๋ฅผ 0.9๋ฐฐ๋กœ ์ค„์ž„.


์ด๊ฒŒ ๋ญ” ์†Œ๋ฆฌ๋ƒ๋ฉด ์ด๊ฑฐ์ž„



viewimage.php?id=2abcdd23dad63db0&no=29bcc427b28677a16fb3dab004c86b6fae7cfdc6a7b48ad83da3c1d4383a9e9b2ec121aa77599a4d2c0e9b5661e748576fe10aa229081345cb2e



๋ฒกํ„ฐ์˜ ํ•ฉ์€ ํ‰ํ–‰์‚ฌ๋ณ€ํ˜•์„ ๊ทธ๋ ค์„œ ์ถœ๋ฐœ์  ๋งž์€ํŽธ ๊ผญ์น˜์ ๊นŒ์ง€์˜ ๋ฒกํ„ฐ์ธ๊ฑธ ์ด์šฉํ•ด์„œ,ย 


ํ”Œ๋ ˆ์ด์–ด์—๊ฒŒ ์ง์„ ์œผ๋กœ ๊ฐ€์ง€ ์•Š๊ณ  ์‚ด์ง 'ํœ˜์–ด์ ธ์„œ' ๊ฐ€๋Š” ๋А๋‚Œ์„ ์ฃผ๋ฉด์„œ ์†๋„๊ฐ€ ๋„ˆ๋ฌด ๋น ๋ฅด์ง€ ์•Š๋„๋ก 0.9๋ฅผ ๊ณฑํ•ด์คŒ.


ํœ˜์–ด์ ธ์„œ ๊ฐ€๋Š” ์ •๋„๋Š” 5f๋‚˜ 0.9f ๋“ฑ์˜ ๊ฐ’์„ ๊ณ„์† ์กฐ์ ˆํ•˜๋ฉด์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์ž„. ๋‚˜๋Š” ๊ฑ ์ €๋ ‡๊ฒŒ ํ•˜๋Š”๊ฒŒ ์ œ์ผ ๋‚˜์•„๋ณด์—ฌ์„œ 5๋ž‘ 0.9๋ฅผ ์„ ํƒํ–ˆ์Œ.


๊ทธ๋ฆฌ๊ณ  ๋ญ ๋ถ€๋”ชํ˜€์„œ ๋ณด์„ ํš๋“ํ•˜๋Š”๊ฑด ์‚ฌ๊ฐํ˜• ๊ฒน์น˜๋Š”๊ฑฐ ์ฒดํฌ ๋กœ์ง์ด๋ž‘ setActive(false)๊ฐ€ ์ „๋ถ€๋‹ˆ๊นŒ ์Šคํ‚ตํ•˜๊ณ .


์ด์ƒ์ž„





---------------------------------


ํ๋ฏธ ์ƒ๊ฐ๋ณด๋‹ค ๊ธ€์“ฐ๋Š”๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋„ค


ํ˜น์‹œ ์„ค๋ช…์ด ์ž˜๋ชป๋˜๊ฑฐ๋‚˜ ์ด์ƒํ•˜๊ฑฐ๋‚˜ 1๋„ ๋ชฐ๋ฅด๊ฒƒ๋‹ค ํ•˜๋ฉด ๋Œ“๊ธ€ ๋‹ฌ๋ฉด ์•„๋Š” ๋‚ด์—์„œ ๋‹ต๋ณ€ํ•ด์คŒ.