Yaminabe

¤é¤¯¤¬¤­¤Ö¤í¤°

¤Æ¤¹¤È¡§Yaminabe¤Á¤ã¤ó¤ÏÀ¸¤Þ¤ì¤¿¤Ð¤«¤ê¤Î¥Ö¥í¥°¤Ç¤¹¡¡¤ß¤ó¤Ê¤ÇÃç¤è¤¯»È¤Ã¤Æ¤Í

¥«¥Æ¥´¥ê¡§ ¥·¥ê¡¼¥º¹ÖºÂ

 

 

ParticleTest

https://dl.dropboxusercontent.com/u/18978109/ParticleTest/ParticleTest.html

 

 

¤º¤¤¤Ö¤ó¤È¹¹¿·¤Î´Ö¤¬³«¤¤¤Æ¤·¤Þ¤¤¡¡¤ªÂÔ¤Á¤¤¤¿¤À¤¤¤¿Êý¤Ë¤Ï¿½¤·Ìõ¤Ê¤¤¤Ç¤¹¡£

 

º£²ó¤ÏDX11¤ò»ÈÍѤ·¤¿¥Ñ¡¼¥Æ¥£¥¯¥ëÉÁ²è¤Î¥µ¥ó¥×¥ë¤òµ­»ö¤Ë¤·¤Æ¤ß¤Þ¤·¤¿¡£¡¡

ºÇ¶áÏÃÂê¤Î¡©GPGPU¥³¥ó¥Ô¥å¡¼¥Æ¥£¥ó¥°¡¡¤Þ¤À¸«¤ÌPS4¤ä¤éXBOXOne¤È¤¤¤Ã¤¿¼¡À¤Â嵡¤Ê¤É¤Ç¼çÎϤˤʤë¤Ç¤¢¤í¤¦GPU¤ò»ÈÍѤ·¤¿·×»»¤Ç¤¹¤Í¡£

GPGPU ¡ÊÈÆÍÑÌÜŪ¤ÎGPU·×»»½èÍý¡Ë¤Ï¥·¥§¡¼¥À¡¼¥×¥í¥°¥é¥à¤ò»ÈÍѤ·¤¿¡¡ÉÁ²è¤ò´Þ¤à¿ÍÑÅӤʷ׻»½èÍý¤Î¤³¤È¤Ç¤¹¡£

GPU¤ÎÉâÆ°ÅÀ¾¯¿ô·×»»¤Ë¶¯¤¤ÅÀ¤ä¥Þ¥ë¥Á¥¹¥ì¥Ã¥ÉÂбþ¤Ê¤É¤ÎÍøÅÀ¤òÀ¸¤«¤·¤ÆCPU¤Î½èÍýÉé²Ù¤ò·Ú¸º¤¹¤ë¤³¤È¤Ç

¼Â¹Ô®ÅÙ¤ò¸þ¾å¤µ¤»¤ë¤³¤È¤¬¼ç´ã¤Ç¤¹¡£

 

¤¤¤Þ¤Î¤È¤³¤íDX11¤ò¥µ¥Ý¡¼¥È¤·¤¿²ÈÄíÍÑPC¤¬»Ô¾ì¤Ë¹­¤¯¹Ô¤­ÅϤë¤Î¤Ï2ǯ¼å¤«¤Ê¤¢¤È¸«ÀѤâ¤Ã¤Æ¤¤¤ë¤Î¤Ç¤¹¤¬¡¢¡¡³«È¯´ü´Ö¤ò¹Í¤¨¤ë¤È

¤½¤í¤½¤íÊÙ¶¯¤·¤Æ¤ª¤«¤Ê¤¤¤ÈÃÖ¤¤¤Æ¤±¤Ü¤ê¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¤¤½¤¦¤Ê¤Î¤Ç¡¢¤³¤ì¤òµ¡²ñ¤ËÊÙ¶¯¤·¤Æ¤ß¤Æ¤Ï¤¤¤«¤¬¤Ç¤·¤ç¤¦¡£

 

º£²ó¤Î¥µ¥ó¥×¥ë¤Î¼Â¹Ô¿ôÃͤϥΡ¼¥ÈPC¤Ç¡¡¡ÊCorei7-2630¡Ê2Ghz)¡¡GeforceGT540M¡Ë¡¡

¥Ñ¡¼¥Æ¥£¥¯¥ë¿ô70Ëü¤Ç¡¡70FPSÁ°¸å¤Ç¤·¤¿¡¡Ä¾ÀÜVRAM¤Ë¥Ç¡¼¥¿¤ò½ñ¤­¹þ¤à¤Î¤Ç¥É¥í¡¼¥³¡¼¥ë¤Ï£±¤Ç¤¹¡£

¥¹¥Ú¥Ã¥¯¤Ï´Ä¶­¤Ë¤è¤Ã¤Æ¤«¤Ê¤êº¹¤¬½Ð¤ë¤È»×¤¤¤Þ¤¹¤Î¤Ç¡¢¤½¤ì¤¾¤ì¤Î´Ä¶­¤Ë¹ç¤ï¤»¤ÆºÇŬÃͤòÀßÄꤷ¤Æ¤¯¤À¤µ¤¤¡£

 

µ­»öÆâ¥ê¥ó¥¯Àè¤Ë¥³¥ó¥Ô¥å¡¼¥È¥·¥§¡¼¥À¤ò»ÈÍѤ·¤¿¥Ñ¡¼¥Æ¥£¥¯¥ë¥ì¥ó¥À¥ê¥ó¥°¤Î¥µ¥ó¥×¥ë¤È ¼Â¹Ô½èÍý®ÅÙ¤ÎÈæ³Óɽ¤¬·ÇºÜ¤µ¤ì¤Æ¤¤¤Þ¤¹¤¬¡¢¥³¥ó¥Ô¥å¡¼¥È¥·¥§¡¼¥À¤ò»ÈÍѤ¹¤ì¤Ð¤Ê¤ó¤Ç¤â¹â®¤Ë½èÍý¤Ç¤­¤ë¤«¤È¤¤¤¦¤È¤½¤¦¤¤¤¦¤ï¤±¤Ç¤â¤Ê¤¯ ¥³¥ó¥Ô¥å¡¼¥È¥·¥§¡¼¥À¤Ë¸þ¤¤¤¿½èÍý¤ä¥Ç¡¼¥¿¹½Â¤¤ò¹©Éפ¹¤ë¤³¤È¤Ç½èÍý®Å٤θþ¾å¤¬´üÂԤǤ­¤ë¤È¤¤¤¦¤³¤È¤ß¤¿¤¤¤Ç¤¹¤Í

GDC¤Ê¤É¤Çȯɽ¤µ¤ì¤Æ¤¤¤ëÆâÍÆ¤Ç¤Ï ήÂη׻»¡¢ÊªÍý±é»»¡¢¥¹¥­¥ó¥·¥§¡¼¥Ç¥£¥ó¥°¡¢¥Ý¥¹¥È¥¨¥Õ¥§¥¯¥È¡¢AI ¤Ê¤É

ÉÁ²è½èÍý¤Î¹â®²½°Ê³°¤Ë¤â¥³¥ó¥Ô¥å¡¼¥È¥·¥§¡¼¥À¤ò»ÈÍѤ·¤¿ÍÍ¡¹¤ÊÍÑÅÓ¤¬¤¢¤ê¤½¤¦¤Ç¤¹¡£

 

¤Á¤Ê¤ß¤Ë¥³¥ó¥Ô¥å¡¼¥È¥·¥§¡¼¥À¤âGPU¤Î¥·¥§¡¼¥À¤Ê¤Î¤Ç¥·¥§¡¼¥ÀÍÑ´Ø¿ô¤·¤«ÍѰդµ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¡¡É¬Íפʴؿô¤Ï¼«ºî¤¹¤ë¤«¥é¥¤¥Ö¥é¥ê¤òήÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£

DirectX11̤¥µ¥Ý¡¼¥È¤ÎGPU¤Ç¥·¥§¡¼¥À¤Ë·×»»¤µ¤»¤¿¤¤¾ì¹ç¤Ï¥³¥ó¥Ô¥å¡¼¥È¥·¥§¡¼¥À¤Î·×»»Éôʬ¤ò¥ì¥ó¥À¥ê¥ó¥°ÍѤΥ·¥§¡¼¥À¤Ë°Ü¿¢¤·¤Æ¡¡¥Ð¥Ã¥Õ¥¡¥á¥â¥ê¤ÎÂå¤ï¤ê¤Ë¥Æ¥¯¥¹¥Á¥ã¤ò¥á¥â¥êÂå¤ï¤ê¤Ë»È¤¦¤³¤È¤ÇGPU¤Ç·×»»¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¾ì¹ç¥Ù¥¯¥È¥ëxyzw¤ò¡¡¥«¥é¡¼rgba¡¡¤ÈÃÖ¤­´¹¤¨¤Æ·×»»¤µ¤»¤Æ¤¯¤À¤µ¤¤¡£¡¡¥Þ¥ë¥Á¥¹¥ì¥Ã¥É·×»»¤Î²¸·Ã¤Ï¸º¤Ã¤Æ¤·¤Þ¤¤¤Þ¤¹¤¬GPU¤Ç¤Î·×»»¤Ï½½Ê¬Â®¤¤¤Î¤ÇCPU·×»»¤Ç¼Â¹Ô®Å٤Υͥ寤ˤʤꤽ¤¦¤ÊÉé²Ù¤Î·Ú¸º¤¬´üÂԤǤ­¤Þ¤¹¡£

 

º£¸å¤ÎŸ˾¤È¤·¤Æ¤Ï¡¡¥é¥¤¥Õ¡¢¥³¥ê¥¸¥ç¥ó¡¢½ÅÎÏ¡¢¥Õ¥©¡¼¥¹¡¢¥Î¥¤¥º¡Ê¥«¡¼¥ë¥Î¥¤¥º¡¢SPH¡¢FFT¡¡¤Ê¤É¡Ë¤Î¥Ñ¥é¥á¡¼¥¿¤ò¼ÂÁõ¤·¤Æ¤¤¤¯¤³¤È¤Ç¡¡¥Ñ¡¼¥Æ¥£¥¯¥ë¥·¥¹¥Æ¥à¤È¤·¤Æ¼ÂÍÑŪ¤Ê¤â¤Î¤Ë¤Ê¤ë¤Î¤Ç¤Ï¤Ê¤¤¤«¤È»×¤¤¤Þ¤¹¡£

 

 

¤È¤¤¤¦¤³¤È¤Ç¤½¤ì¤¾¤ì¹©Éפ·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¤Ê¡¡¡¡¡¡¡¦¡¦¡¦¤È¤¤¤¦Åꤲ¤Ã¤Ñ¤Ê¤·¡Ê¾Ð¡¡

 

¢£º£²ó»²¹Í¤Ë¤·¤¿¥ê¥ó¥¯

Compute Shaders

Unity 4.0¡§ Compute Shader¤ò»È¤Ã¤Æ¤ß¤ë 

DirectX¤ÎÏà Âè108²ó - ¤â¤ó¤·¤ç¤ÎÁã·ê

Compute Shader Overview (Windows)

¤Û¤«¤Ë¤â»²¹Í¤Ë¤·¤¿¤È¤³¤í¤¬¤¢¤Ã¤¿¤Î¤Ç¤¹¤¬ ¤¤¤Ä¤Î´Ö¤Ë¤«¤Î¥ê¥ó¥¯ÀÚ¤ì¤ÇÄÉÀפǤ­¤Þ¤»¤ó¤Ç¤·¤¿¡£

¤Ê¤Î¤ÇÉÔÌÀ¤ÊÅÀ¤¬¤¢¤ì¤Ð¤Û¤«¤Î¾Ü¤·¤¤¥µ¥¤¥È¤µ¤ó¤òõ¤¹¤« ¤³¤Îµ­»ö¤Î¥³¥á¥ó¥ÈÍó¤Ë¼ÁÌä¤òÅꤲ¤Æ¤¯¤À¤µ¤¤¡£

 

 

¢¨¥¹¥¯¥ê¥×¥È̾¤¬°ã¤Ã¤Æ¤¤¤Þ¤¹¤¬¡¡¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤Ø¤ÎÀßÃ֤Ϥ³¤Î²èÁü¤ò»²¹Í¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£

inspector

 

 

¢£¥ì¥ó¥À¥ê¥ó¥°¥·¥§¡¼¥À¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡

 

[maxvertexcount(4)] // ¥¸¥ª¥á¥È¥ê¥·¥§¡¼¥À¤Ç»ÈÍѤ¹¤ëĺÅÀ¿ô¤ò»ØÄê ¡ä º£²ó¤Ï£´ÄºÅÀ¤Ê¤Î¤Ç£´¤ò»ØÄê
void geom (point vs_out input[1], inout TriangleStream outStream)
{


gs_out output;

float4 corLoc = mul(UNITY_MATRIX_MVP, input[0].pos);

// ¥Ñ¡¼¥Æ¥£¥¯¥ëºÂɸ¥Ç¡¼¥¿¤òMVP¡Ê¥Ó¥å¡¼ºÂɸ¡Ë¤ËÊÑ´¹ 

 

output.pos = corLoc + float4(-dx, dy,0,0);

output.uv=float2(0,0);
output.col = input[0].col;

outStream.Append (output);

// output.pos ¡ácorLoc¡Ê¥Ñ¡¼¥Æ¥£¥¯¥ë¥·¥¹¥Æ¥àÃæ¿´ºÂɸ¡Ë + float4¡Ê¥Ñ¡¼¥Æ¥£¥¯¥ëĺÅÀ º¸¾å¡Ë;

// output.uv ¡á float2(UVºÂɸ º¸¾å¡Ë;

// output.col ¡á input[0].col¡¨¡ÊĺÅÀ¥«¥é¡¼ º¸¾å¡Ë;

// outStream.Append (output);     //¥¹¥È¥ê¡¼¥à¤Ë£±ÄºÅÀʬ¤Î¥Ç¡¼¥¿¤ò½ÐÎÏ

 

//°Ê²¼ ±¦¾å¡¢º¸²¼¡¢±¦²¼¤Î½ç¤Ë ¥¹¥È¥ê¡¼¥à¤Ë½ÐÎÏ     ¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä

 

outStream.RestartStrip(); // ¥Ó¥ë¥Ü¡¼¥É¥á¥Ã¥·¥å¤ÎÉÁ²è


}

 

¥ì¥ó¥À¥ê¥ó¥°ÍѤΥ·¥§¡¼¥À¤ÏÄ̾ï¤Î¥·¥§¡¼¥À¤ÈÊѤï¤ê¤Þ¤»¤ó¤¬¹â®ÉÁ²è¤Î¤¿¤á¤ËÊѹ¹ÅÀ¤¬¤¢¤ê¤Þ¤¹

¡ü¥¸¥ª¥á¥È¥ê¥·¥§¡¼¥À¡¼¤Î»ÈÍÑ

¡üStructuredBuffer¤Î»ÈÍÑ

 

¥¸¥ª¥á¥È¥ê¥·¥§¡¼¥À¤Ï¥·¥§¡¼¥À¤ò»ÈÍѤ·¤ÆGPUÆâ¤Ç¥á¥Ã¥·¥å¤òÉÁ²è¤¹¤ë¤¿¤á¤Î¥·¥§¡¼¥À¤Ç¤¹¡£

ÂçÎ̤Υá¥Ã¥·¥å¤ÎĺÅÀ¥Ç¡¼¥¿¤òGPU¦¤ËÁ÷¤ë¤Î¤Ï½èÍý¸úΨ¤¬°­¤¤¤¿¤á¡¡¡¡¥Ñ¡¼¥Æ¥£¥¯¥ë¤ÎºÂɸ¥Ç¡¼¥¿¡Ê¥»¥ó¥¿¡¼ºÂɸ¡Ë ¤ä¥«¥é¡¼¥Ç¡¼¥¿¤Ê¤É¤ÎºÇ¾®¸Â¤Î¥Ç¡¼¥¿¤ò¥¢¥Ã¥×¥Ç¡¼¥È¤·¤Æ¥¸¥ª¥á¥È¥ê¥·¥§¡¼¥À¤Ç¥á¥Ã¥·¥å²½¤¹¤ë¤³¤È¤Ç½èÍý®Å٤θþ¾å¤ò¤¹¤ë¤³¤È¤¬´üÂÔ½ÐÍè¤Þ¤¹¡£¡¡¡¡¡¡ ¤Á¤Ê¤ß¤Ë¥¸¥ª¥á¥È¥ê¥·¥§¡¼¥À¤Ç°ìÅÙ¤ËÉÁ²è¤Ç¤­¤ëĺÅÀ¿ô¤Ï256¤Ç¤¹¡£

¡ü¤µ¤é¤ËStructuredBuffer¡Ê¥·¥§¡¼¥À¥â¥Ç¥ë5¡ËÆÉ¤ß½ñ¤­¤¬²Äǽ¤Ê¥Ð¥Ã¥Õ¥¡¡£¤ò »ÈÍѤ¹¤ë¤³¤È¤ÇCPU¡ÝGPU´Ö¤Ç¤Î¥Ç¡¼¥¿¤ä¤ê¤È¤ê¤¹¤ë»þ¥¹¥¯¥ê¥×¥È¤«¤é¹â®¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤¹¡£

¥·¥§¡¼¥À¡¼¥â¥Ç¥ë4¤Ë¤â cbuffer¡Ê¥³¥ó¥¹¥¿¥ó¥È¥Ð¥Ã¥Õ¥¡¡Ë¡¢tbuffer¡Ê¥Æ¥¯¥¹¥Á¥ã¥Ð¥Ã¥Õ¥¡¡Ë¤È¤¤¤¦»÷¤¿¤è¤¦¤Ê¥Ð¥Ã¥Õ¥¡¤¬

¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤¿¤Î¤Ç¤¹¤¬ ¥·¥§¡¼¥À¥â¥Ç¥ë5¤«¤éStructuredBuffer¤Ç¤½¤ì¤é¤ò¤Þ¤È¤á¤Æ°·¤¦¤³¤È¤¬¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¤è¤¦¤Ç¤¹¡£

¹½Â¤ÂΤǤâÄê¿ô¤Ç¤â¤¤¤±¤ë¤Î¤Çº£¸å¤Ï¥³¥ì¤ò»È¤Ã¤Æ¤È¤¤¤¦¤³¤È¤Ê¤Î¤«¤Ê¡©¡¡

 

 

¢¨¡¡º£²ó¤Î¥µ¥ó¥×¥ë¤Ç¤Ï¥«¥á¥éÊý¸þ¤Ë¥Ó¥ë¥Ü¡¼¥É¤Î¥Õ¥§¡¼¥¹Ì̤ò¸þ¤±¤ë½èÍý¤ò¾Êά¤·¤Æ¤¢¤ê¤Þ¤¹

 

 

 

¢£¥³¥ó¥Ô¥å¡¼¥È¥·¥§¡¼¥À¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡

RWStructuredBuffer posBuffer : register(u0);

¥¹¥ì¥Ã¥É¤Ïº£²ó¤ÎÎã¤À¤È £±¼¡¸µÇÛÎó¤ò»ÈÍѤ¹¤ë¤Î¤Ç ¥¹¥ì¥Ã¥ÉID ¤Ïuint3·¿¤Ç ID.xyz¤Î¤¦¤Á¤Î£±¼¡¸µ¤ÎÍ×ÁÇID.x¤Ç»ØÄꤷ¤Þ¤¹

 

 

#pragma kernel CSMain

RWStructuredBuffer posBuffer : register(u0);

[numthreads(10,1,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{

¤³¤³¤Ç·×»»

¡ã¥¹¥ì¥Ã¥ÉID¤Ï £±¼¡¸µÇÛÎó¤ò»ÈÍѤ¹¤ë¾ì¹ç id.xyz ¤Î¤¦¤Á id.x ¤Ç»ØÄꤹ¤ë Îã¡§ posBuffer[id.x]¡ä
}

 

¼Â¹Ô¥«¡¼¥Í¥ë¤ÎÀë¸À¡¡¡¡¡¡#pragma kernel CSMain

¥¹¥¯¥ê¥×¥È¤«¤é¥³¥ó¥Ô¥å¡¼¥È¥·¥§¡¼¥À¤Î¥«¡¼¥Í¥ë¤Ë¼Â¹Ô¤ò»ØÄꤹ¤ë»þ¤Ë̾Á°¤ò»ØÄꤷ¤Þ¤¹

 

RWStructuredBuffer posBuffer : register(u0);

¹½Â¤ÂΤ¬»ÈÍѲÄǽ¤ÊÆÉ¤ß½ñ¤­²Äǽ¤Ê¥Ð¥Ã¥Õ¥¡¡¼

¥ê¥Õ¥¡¥ì¥ó¥¹¤Ë¤è¤ë¤È¡¡register ¡Ê¡Ë¤Ï¾Êά²Äǽ¤È¤¤¤¦²òÀ⤬¤µ¤ì¤Æ¤¤¤¿¤Î¤Ç¤¹¤¬¡¡¤Á¤ç¤Ã¤ÈÀµ³Î¤Ë¤Ï¤ï¤«¤ê¤Þ¤»¤ó

 

[numthreads(10,1,1)]
void CSMain (uint3 id : SV_DispatchThreadID)

numthreads ¤¬ Compute Shader 1²óʬ¤Î¥¹¥ì¥Ã¥É¤Î°ÕÌ£¤Ç¤¹¡£
¤³¤ÎÎã¤À¤È10*1*1¡¡=10¥¹¥ì¥Ã¥É¡¡¡¡¿ôÃͤϼ«Í³¤Ë³ä¤êÉÕ¤±¤é¤ì¤Þ¤¹¤¬·×»»Í×ÁǤΥ¹¥¿¥¤¥ë¤Ë±þ¤¸¤Æ

1¼¡¸µ¤«¤é3¼¡¸µ¤Þ¤Ç¤ÎID¤Ë¥¢¥¯¥»¥¹¤·¤ä¤¹¤¤¥µ¥¤¥º¤ò³ä¤êÉÕ¤±¤ë¤È¥¢¥¯¥»¥¹¤¬ÊØÍø¤Ç¤¹¡£¡¡

º£²ó¤Î¾ì¹ç¤Ï¤ï¤«¤ê¤ä¤¹¤¯1¼¡¸µÇÛÎó¤Ë¤·¤Æ¤¢¤ê¤Þ¤¹¡£

ºÇÂ祹¥ì¥Ã¥É¿ô¤Ï¥·¥§¡¼¥À¥Ð¡¼¥¸¥ç¥ó4.0¤Ç786¡¢¥·¥§¡¼¥À¥Ð¡¼¥¸¥ç¥ó5.0¤Ç1024¤È¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£

¥·¥§¡¼¥À¥Ð¡¼¥¸¥ç¥ó4.0¤Ç¤Ï£ú¤¬£±¤·¤«¤È¤ì¤Ê¤¤ÅÀ¤Ëµ¤¤ò¤Ä¤±¤Æ¤¯¤À¤µ¤¤¡£


Compute Shader Maximum Z Maximum Threads (X*Y*Z)
cs_4_x 1 768
cs_5_0 64 1024

¢¨¥¹¥ì¥Ã¥ÉºÇÂç¿ô¤Ï¤¢¤¯¤Þ¤ÇÌܰ¤Τ褦¤Ç ´Ä¶­¤Ë¤è¤Ã¤Æ¤Ïưºî¤·¤Ê¤¤»ö¤¬¤¢¤ë¤è¤¦¤Ç¤¹¡£ GPU¤ÎÀ­Ç½¤Ê¤Î¤«¥á¡¼¥«¡¼¤Ë¤è¤ëº¹°Û¤Ê¤Î¤«¸¶°ø¤¬ÆÃÄê¤Ç¤­¤Æ¤¤¤Þ¤»¤ó¤¬¡¢Æ°ºî¤¬°ÂÄꤷ¤Ê¤¤¾ì¹ç¤Ï¥¹¥ì¥Ã¥É¤Î¿ô¤ò¾¯¤Ê¤á¤ËÀßÄꤹ¤ë¤³¤È¤Ç²þÁ±¤¹¤ë¾ì¹ç¤¬¤¢¤ë¤è¤¦¤Ç¤¹¡£

 

void CSMain (uint3 id : SV_DispatchThreadID)

¤Û¤«¤Ë¤â¥¹¥ì¥Ã¥É¤Î°ú¿ô¤Ï

¡¡SV_GroupIndex, ¡¡SV_DispatchThreadID, ¡¡SV_GroupThreadID, ¡¡SV_GroupID

¤Ê¤É¤ÎÃͤòÀßÄê½ÐÍè¤Þ¤¹¡£

 

¤½¤ì¤¾¤ì¤ÎÃͤδط¸¤Ï°Ê²¼¤Î¤È¤ª¤ê


Illustration of a single thread within a thread group of 50 threads

SV_GroupThreadID  SV_GroupID SV_DispatchThreadID SV_GroupIndex
x, y, z x', y', z' x'*X+x, y'*Y+y, z'*Y+z z*X*Y+y*X+x

 

DX£±£±¥×¥í¥°¥é¥à¤Î¾ÜºÙ¤Ïµ­»öÆâ¥ê¥ó¥¯Àè¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤

 

 

 

¥¹¥¯¥ê¥×¥ÈÉô¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡

¥«¥á¥é¤Ë¥»¥Ã¥È¤·¤Æ»ÈÍѤ¹¤ë¥¹¥¯¥ê¥×¥È¤Î¾ì¹ç¡¡´ðËܤϥ¤¥á¡¼¥¸¥¨¥Õ¥§¥¯¥È¤Î¥¹¥¯¥ê¥×¥È¤ÈƱ¤¸¥¹¥¿¥¤¥ë¤Ë¤Ê¤ê¤Þ¤¹¡£

 

¡üStart( )¥á¥½¥Ã¥ÉÆâ¤Ç

particleBuffer = new ComputeBuffer(particleCount, 12);
particleBuffer.SetData(particleLocations);


ComputeBuffer¤Î½é´ü²½¤ò¹Ô¤¤¤Þ¤¹¡¡

ComputeBuffer (ÇÛÎóÁ´ÂΤοô : int, ÇÛÎó¸Ä¡¹¤Î¥µ¥¤¥º : int, type : ComputeBufferType)

º£²ó¤Ï»ÈÍѤ·¤Æ¤¤¤Þ¤»¤ó¤¬3ÈÖÌܤΰú¿ô¤Ï¥Ð¥Ã¥Õ¥¡¥¿¥¤¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£

SetData()¤ò»ÈÍѤ·¤Æ¡¡ComputeBuffer¤Ë¥¹¥¯¥ê¥×¥È¦¤Î½é´ü²½¤·¤¿ÇÛÎó¤ò¥»¥Ã¥È¤·¤Þ¤¹¡£

 


¡üUpdate( )¥á¥½¥Ã¥ÉÆâ¤Ç

cs.SetBuffer (cs.FindKernel ("CSMain"), "PosBuffer", ParticleBuffer);
cs.Dispatch (cs.FindKernel ("CSMain"), particleCount, 1, 1);

 

¥¹¥¯¥ê¥×¥ÈÃæ¤Îcs¤ÏComputeShader¤òÀßÄꤹ¤ëºÝ¤Ë¼«Í³¤Ë̾Á°¤ò³ä¤ê¿¶¤ì¤Þ¤¹¤Î¤Ç

public ComputeShader cs;

¤ÈÀë¸À¤·¤Æ¥¹¥¯¥ê¥×¥È¤¬¾éĹ¤Ë¤Ê¤é¤Ê¤¤¤è¤¦¤Ê̾Á°¤ò¤Ä¤±¤Þ¤¹

cs.SetBuffer (cs.FindKernel ("CSMain"), "PosBuffer", ParticleBuffer);

¡¡¡¡FindKernel ("CSMain")¡¡¤ÏComputeShaderÆâ¤Ç¡É#pragma kernel CSMain¡É¤È¤·¤ÆÀë¸À¤·¤¿Ì¾Á°¤Î¥«¡¼¥Í¥ë¤ò

¡¡¡¡Ãµ¤·¤ÆComputeShader¤Î¥Ð¥Ã¥Õ¥¡¤Ë¥¹¥¯¥ê¥×¥È¤ÇÀßÄꤷ¤¿¥Ð¥Ã¥Õ¥¡¤ò¥»¥Ã¥È¤·¤Þ¤¹¡£

¡¡¡¡¤¹¤Ù¤Æ¤Î¥Ç¡¼¥¿¤ò¥»¥Ã¥È¤·½ª¤¨¤¿¤éDispatch( ) ¤ò»ÈÍѤ·¤Æ¥¹¥ì¥Ã¥É·×»»¤ò³«»Ï¤µ¤»¤Þ¤¹¡£

 

void Dispatch(   UINT¡¡x ,   UINT y ,   UINT z );

¡¡¡¡°ú¿ô¤Ïuint¡Êint¡Ë·¿¤Ç¡¡ComputeShader¤Ç·×»»¤µ¤»¤ë¥¹¥ì¥Ã¥É¤Î¼¡¿ô¤Ë¤¢¤ï¤»¤Æ¤¯¤À¤µ¤¤

 

 

¡üOnRenderImage()¥á¥½¥Ã¥ÉÆâ¤Ç

mat.SetBuffer("particleBuffer", particleBuffer);

Graphics.DrawProcedural (MeshTopology.Triangles, particleCount);

mat¤Ï¥ì¥ó¥À¥ê¥ó¥°¤Ë»ÈÍѤ¹¤ë¥·¥§¡¼¥À¤ò¼¨¤·¤Þ¤¹¡¡ComputeShader¤Ç·×»»¤µ¤ì¤¿·ë²Ì¤ò

¥ì¥ó¥À¥ê¥ó¥°ÍѤΥ·¥§¡¼¥À¤Ë¥»¥Ã¥È¤·¤Þ¤¹¡£

 

DrawProcedural (  MeshTopology.Type    , particleCount  );

 

MeshTopology.Type  ¤Ë¤ÏÉÁ²è¥¹¥¿¥¤¥ë¤òÀßÄꤷ¤Þ¤¹¡¡Triangles | Quads¡¡| Lines¡¡| LineStrip¡¡| Points

¤Ê¤É¤Î¼ïÎब¤¢¤ê¤Þ¤¹¤¬¡¢¡¡º£²ó¤Ï¥·¥§¡¼¥À¦¤Ç¥¸¥ª¥á¥È¥ê¥·¥§¡¼¥À¤ò»ÈÍѤ·¤Æ¥á¥Ã¥·¥åÉÁ²è¤¹¤ë¤¿¤á

ÉÁ²è¤¹¤ë²ó¿ô¡ÊparticleCount  ¡á¡¡¥Ñ¡¼¥Æ¥£¥¯¥ë¿ô¡Ë¤À¤±¹ç¤Ã¤Æ¤¤¤ì¤Ð²¿¤ò»ØÄꤷ¤Æ¤â¤è¤¤¤Ç¤¹¡£

DrawProcedural ¡Ê¡¡¡ËÌ¿Îá¤Ï¡¡ÄºÅÀ¥Ç¡¼¥¿¤òGPU¤Î¤ËžÁ÷¤»¤º¤ËľÀÜVRAM¤ËÉÁ²è¤¹¤ëÌ¿Îá¤Ç¤¹¡¡Îà»÷¤ÎÌ¿Îá

DrawProceduralIndirect(¡¡)¤È¤Î°ã¤¤¤Ï

DrawProceduralIndirect(¡¡)¤ÏGPU¦¤«¤é¤Î¥³¡¼¥ë¥Ð¥Ã¥¯¤¬Ìµ¤¤ÅÀ¤Ç¤¹¡£¡Ê¤Ä¤Þ¤ê¥Ç¡¼¥¿¤ÎºÆÍøÍÑÉԲġË

 

 

 

 

¢£¥³¥ó¥Ô¥å¡¼¥È¥·¥§¡¼¥À»ÈÍÑ»þ¤Î¥Ç¡¼¥¿¤Îή¤ì¤ò°Ê²¼¤Î¿Þ¤Ë¼¨¤·¤Þ¤¹

¥³¥ó¥Ô¥å¡¼¥È¥·¥§¡¼¥À

 

 

¢£ ¡ÈParticleController_Sample.cs

using UnityEngine;
using System.Collections;
using System.Threading;



public class ParticleController_Sample : MonoBehaviour {


public Texture2D particleTexture;

public Shader shader;
private Material mat;

public float PScale = 1.0f;

public ComputeShader cs;

public int particleCount = 1000;
public Transform OriginLocation;


private Vector3[] particleLocations;
private Vector3[] particleColors;
private Vector3[] particleVelocities;

private ComputeBuffer particleBuffer;
private ComputeBuffer particleColorBuffer;
private ComputeBuffer velocityBuffer;




Thread csThread;


void Start()
{

particleLocations = new Vector3[particleCount];
particleColors = new Vector3[particleCount];
particleVelocities = new Vector3[particleCount];


for (int i = 0; i < particleCount; i++)
{

particleLocations[i] = OriginLocation.position + Random.insideUnitSphere;
particleVelocities[i] = Random.insideUnitSphere;
particleColors[i] = new Vector3(Random.value,Random.value,Random.value);


}

particleBuffer = new ComputeBuffer(particleCount, 12);
particleBuffer.SetData(particleLocations);

velocityBuffer= new ComputeBuffer(particleCount, 12);
velocityBuffer.SetData (particleVelocities);

particleColorBuffer = new ComputeBuffer(particleCount, 12);
particleColorBuffer.SetData (particleColors);





mat = new Material(shader);
mat.hideFlags = HideFlags.HideAndDontSave;

mat.SetTexture ("_Sprite", particleTexture);
mat.SetFloat ("Size", PScale );

}

private void ReleaseResources()
{
csThread.Abort ();

particleBuffer.Release ();
particleColorBuffer.Release ();
velocityBuffer.Release ();

Object.DestroyImmediate (mat);
}

void OnDisable()
{
ReleaseResources ();
}


void Update()
{


cs.SetFloat ("Time",Time.timeSinceLevelLoad);
cs.SetVector ("Origin", OriginLocation.position);

cs.SetBuffer (cs.FindKernel ("CSMain"), "colBuffer", particleColorBuffer);
cs.SetBuffer (cs.FindKernel ("CSMain"), "posBuffer", particleBuffer);
cs.SetBuffer (cs.FindKernel ("CSMain"), "velBuffer", velocityBuffer);

cs.Dispatch (cs.FindKernel ("CSMain"), particleCount, 1, 1);

}

void OnRenderImage(RenderTexture src, RenderTexture dst)
{


Graphics.Blit( src, dst);

mat.SetBuffer("particleBuffer", particleBuffer);
mat.SetBuffer("particleColor", particleColorBuffer);
mat.SetPass (0);

Graphics.DrawProcedural(MeshTopology.Triangles, particleCount);




}
}


 

¢£ ¡Écompute_sample.compute¡É



#pragma kernel CSMain




RWStructuredBuffer posBuffer : register(u0);
RWStructuredBuffer velBuffer : register(u1);
RWStructuredBuffer colBuffer : register(u2);



float Time;
float4 Origin;
float PI = 3.1415926;



[numthreads(16,1,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{

uint Tid = id.x;

colBuffer[Tid ].r = 0.1;
colBuffer[Tid ].g =1.0;
colBuffer[Tid ].b = 0.4;

float3 NewPos;


NewPos.x = Origin.x + (sin(Time/10.0 * Tid ) ) * 30;
NewPos.y = Origin.y + (cos((Time/10.0+PI ) * Tid ) ) *30;
NewPos.z = Origin.z + (cos(Time /10.0 * Tid ) )*30;



velBuffer[Tid ].x = NewPos.x - posBuffer[Tid ].x;
velBuffer[Tid ].y = NewPos.y - posBuffer[Tid ].y;
velBuffer[Tid ].z = NewPos.z - posBuffer[Tid ].z;


posBuffer[Tid ].x += velBuffer[Tid ].x / 40;
posBuffer[Tid ].y += velBuffer[Tid ].y / 40;
posBuffer[Tid ].z += velBuffer[Tid ].z / 40;

}



 

¢£ ¡ÈRenderParticles.shader¡É

Shader "Custom/RenderParticles" {
Properties {
_Sprite ("Sprite", 2D) = "white" {}
}

SubShader {
Pass{
ZWrite Off ZTest Always Cull Off Fog { Mode Off }
Blend SrcAlpha One



CGPROGRAM
#pragma target 5.0

#pragma vertex vert
#pragma geometry geom
#pragma fragment frag

#include "UnityCG.cginc"

StructuredBuffer particleBuffer;
StructuredBuffer particleColor;

float Size = 0.3f;

   sampler2D _Sprite;

struct vs_out {
float4 pos : SV_POSITION;
float4 col : COLOR;
};

vs_out vert (uint id : SV_VertexID)
{
vs_out o;
o.pos =mul(_Object2World, float4(particleBuffer[id], 1.0f));
o.col = float4(particleColor[id], 1.0f);
return o;
}

struct gs_out {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float4 col : COLOR;
};

[maxvertexcount(4)]
void geom (point vs_out input[1], inout TriangleStream outStream)
{


float dx = Size;
float dy = Size * _ScreenParams.x / _ScreenParams.y;
gs_out output;


float4 corLoc = mul(UNITY_MATRIX_MVP, input[0].pos);

output.pos = corLoc + float4(-dx, dy,0,0); output.uv=float2(0,0);
output.col = input[0].col; outStream.Append (output);
output.pos = corLoc + float4( dx, dy,0,0); output.uv=float2(1,0);
output.col = input[0].col; outStream.Append (output);
output.pos = corLoc + float4(-dx,-dy,0,0); output.uv=float2(0,1);
output.col = input[0].col; outStream.Append (output);
output.pos = corLoc + float4( dx,-dy,0,0); output.uv=float2(1,1);
output.col = input[0].col; outStream.Append (output);

outStream.RestartStrip();
}



fixed4 frag (gs_out i ) : COLOR0
{
fixed4 col = tex2D(_Sprite, i.uv);
col.a = 0.8f;
col *= i.col;
return col;
}

ENDCG

}
}

Fallback Off
}

 

°Å¹æ²½¤Ë¤Ä¤¤¤Æ¤Î¸¡º÷¤¬¤¢¤ê¤Þ¤·¤¿¤Î¤Ç ¤¤¤¯¤Ä¤«¥µ¥ó¥×¥ë¤ò·ÇºÜ¤·¤Þ¤·¤¿¡£

 

°Å¹æ²½¤Î´ðËÜŪ¤Ê¤ä¤êÊý¤Ç¤¹¤¬Å¬Åö¤Êʸ»úÎ󥯡¼¥Ö¥ë¤òºîÀ®¤·¤Æ ÆÈ¼«¤Î¤ä¤êÊý¤Çʸ»úÎóÁàºî¤ò¤¹¤ë¤³¤È¤Ç°Å¹æ²½¤ò¤ª¤³¤Ê¤¤¤Þ¤¹¡£

¤È¤¤¤¦¤Î¤Ç¤Ï¥¤¥á¡¼¥¸¤¬Í¯¤«¤Ê¤¤¤È»×¤¤¤Þ¤¹¤Î¤Ç ¥µ¥ó¥×¥ë¥³¡¼¥É¤ò¤¤¤¯¤Ä¤«Ãê½Ð¤·¤Æ¤ß¤Þ¤·¤¿¡£

¥»¡¼¥Ö¥Ç¡¼¥¿¤Ê¤É¤òPlayerPrefs¤Ê¤É¤ËÊݸ¤·¤¿¤¤¾ì¹ç ´Êñ¤ËÃæ¤¬¸«¤ì¤Æ¤·¤Þ¤¦¤Î¤ÇÆñÆÉ²½¤¹¤ëɬÍפ¬½Ð¤ÆÍè¤ë¤«¤È»×¤¤¤Þ¤¹¡£ PlayerPrefs °Å¹æ²½¤Î¥µ¥ó¥×¥ë¤Ï´Êñ¤Ê¥Æ¡¼¥Ö¥ëºîÀ®¤Ë¤è¤ë°Å¹æ²½¤Ç¤¹¡£

MD5°Å¹æ²½¤Ï¥Í¥Ã¥È¾å¤Ç¹­¤¯»ÈÍѤµ¤ì¤Æ¤¤¤ë°Å¹æ²½¤Ç¤¹ ¡Ê´Êñ¤Ç¤Ï¤Ê¤¤¤Ç¤¹¤¬²òÀϤǤ­¤Ê¤¯¤Ï¤Ê¤¤¡Ë

AES°Å¹æ²½¤ÏºÇ¶á¤è¤¯Ì¾Á°¤Îµó¤¬¤ëTOR¤Ë¤â»ÈÍѤµ¤ì¤Æ¤¤¤ë°Å¹æ²½µ»½Ñ¤Ç¤¹¡£

 

¢£PlayerPrefs °Å¹æ²½¤Î¥µ¥ó¥×¥ë

 

http://forum.unity3d.com/threads/26437-PlayerPrefs-Encryption

¡ü»ÈÍÑÊýË¡

void Start () {

// this array should be filled before you can use EncryptedPlayerPrefs :

EncryptedPlayerPrefs.keys=new string[5];

EncryptedPlayerPrefs.keys[0]="23Wrudre";

EncryptedPlayerPrefs.keys[1]="SP9DupHa";

EncryptedPlayerPrefs.keys[2]="frA5rAS3";

EncryptedPlayerPrefs.keys[3]="tHat2epr";

EncryptedPlayerPrefs.keys[4]="jaw3eDAs";



EncryptedPlayerPrefs.SetString("test_string", "Hello World");

Debug.Log(EncryptedPlayerPrefs.GetString("test_string", "default"));



EncryptedPlayerPrefs.SetInt("test_int", 500);

Debug.Log(EncryptedPlayerPrefs.GetInt("test_int", -1));



EncryptedPlayerPrefs.SetFloat("test_float", 500.456);

Debug.Log(EncryptedPlayerPrefs.GetFloat("test_float", -1f));

}

¡ü¥á¥½¥Ã¥É¤ÎËÜÂÎ

using UnityEngine;

using System.Collections;

using System.Security.Cryptography;

using System.Text;



public class EncryptedPlayerPrefs {



// Encrypted PlayerPrefs

// Written by Sven Magnus

// MD5 code by Matthew Wegner (from [url]http://www.unifycommunity.com/wiki/index.php?title=MD5[/url])





// Modify this key in this file :

private static string privateKey="9ETrEsWaFRach3gexaDr";



// Add some values to this array before using EncryptedPlayerPrefs

public static string[] keys;





public static string Md5(string strToEncrypt) {

UTF8Encoding ue = new UTF8Encoding();

byte[] bytes = ue.GetBytes(strToEncrypt);



MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

byte[] hashBytes = md5.ComputeHash(bytes);



string hashString = "";



for (int i = 0; i < hashBytes.Length; i++) {

hashString += System.Convert.ToString(hashBytes[i], 16).PadLeft(2, '0');

}



return hashString.PadLeft(32, '0');

}



public static void SaveEncryption(string key, string type, string value) {

int keyIndex = (int)Mathf.Floor(Random.value * keys.Length);

string secretKey = keys[keyIndex];

string check = Md5(type + "_" + privateKey + "_" + secretKey + "_" + value);

PlayerPrefs.SetString(key + "_encryption_check", check);

PlayerPrefs.SetInt(key + "_used_key", keyIndex);

}



public static bool CheckEncryption(string key, string type, string value) {

int keyIndex = PlayerPrefs.GetInt(key + "_used_key");

string secretKey = keys[keyIndex];

string check = Md5(type + "_" + privateKey + "_" + secretKey + "_" + value);

if(!PlayerPrefs.HasKey(key + "_encryption_check")) return false;

string storedCheck = PlayerPrefs.GetString(key + "_encryption_check");

return storedCheck == check;

}



public static void SetInt(string key, int value) {

PlayerPrefs.SetInt(key, value);

SaveEncryption(key, "int", value.ToString());

}



public static void SetFloat(string key, float value) {

PlayerPrefs.SetFloat(key, value);

SaveEncryption(key, "float", Mathf.Floor(value*1000).ToString());

}



public static void SetString(string key, string value) {

PlayerPrefs.SetString(key, value);

SaveEncryption(key, "string", value);

}



public static int GetInt(string key) {

return GetInt(key, 0);

}



public static float GetFloat(string key) {

return GetFloat(key, 0f);

}



public static string GetString(string key) {

return GetString(key, "");

}



public static int GetInt(string key,int defaultValue) {

int value = PlayerPrefs.GetInt(key);

if(!CheckEncryption(key, "int", value.ToString())) return defaultValue;

return value;

}



public static float GetFloat(string key, float defaultValue) {

float value = PlayerPrefs.GetFloat(key);

if(!CheckEncryption(key, "float", Mathf.Floor(value*1000).ToString())) return defaultValue;

return value;

}



public static string GetString(string key, string defaultValue) {

string value = PlayerPrefs.GetString(key);

if(!CheckEncryption(key, "string", value)) return defaultValue;

return value;

}



public static bool HasKey(string key) {

return PlayerPrefs.HasKey(key);

}



public static void DeleteKey(string key) {

PlayerPrefs.DeleteKey(key);

PlayerPrefs.DeleteKey(key + "_encryption_check");

PlayerPrefs.DeleteKey(key + "_used_key");

}



}

 

 

¢£MD5 °Å¹æ²½¤Î¥µ¥ó¥×¥ë                

 

¡üUnity¤Î¥Õ¥©¡¼¥é¥àWIki¤Î¥µ¥ó¥×¥ë

http://wiki.unity3d.com/index.php?title=MD5

public  string Md5Sum(string strToEncrypt)
{
System.Text.UTF8Encoding ue = new System.Text.UTF8Encoding();
byte[] bytes = ue.GetBytes(strToEncrypt);

// encrypt bytes
System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] hashBytes = md5.ComputeHash(bytes);

// Convert the encrypted bytes back to a string (base 16)
string hashString = "";

for (int i = 0; i < hashBytes.Length; i++)
{
hashString += System.Convert.ToString(hashBytes[i], 16).PadLeft(2, '0');
}

return hashString.PadLeft(32, '0');
}

 

¡üUnity¥Õ¥©¡¼¥é¥à¤Î¥µ¥ó¥×¥ë

http://forum.unity3d.com/threads/114688-Encryption-In-Unity-Programs

using UnityEngine;

using System.Collections;

using System.Security.Cryptography;

using System.Text;

using System;

using Org.BouncyCastle.Crypto;

using Org.BouncyCastle.Crypto.Paddings;

using Org.BouncyCastle.Crypto.Engines;

using Org.BouncyCastle.Crypto.Parameters;



public class Encoding : MonoBehaviour

{

public class BCEngine

{

private readonly Encoding _encoding;

private readonly IBlockCipher _blockCipher;

private PaddedBufferedBlockCipher _cipher;

private IBlockCipherPadding _padding;



public BCEngine(IBlockCipher blockCipher)

{

_blockCipher = blockCipher;

}



public void SetPadding(IBlockCipherPadding padding)

{

if(padding != null)

_padding = padding;

}



public string Encrypt(string plain, string key)

{

byte[] result = BouncyCastleCrypto(true, System.Text.Encoding.ASCII.GetBytes(plain), key);

return Convert.ToBase64String(result);

}



public string Decrypt(string cipher, string key)

{

byte[] result = BouncyCastleCrypto(false, Convert.FromBase64String(cipher), key);

return System.Text.Encoding.ASCII.GetString(result);

}



///

///

///


///

///

///

///

///





private byte[] BouncyCastleCrypto(bool forEncrypt, byte[] input, string key)

{

try

{

_cipher = _padding == null ? new PaddedBufferedBlockCipher(_blockCipher) : new PaddedBufferedBlockCipher(_blockCipher, _padding);

byte[] keyByte = System.Text.Encoding.ASCII.GetBytes(key);

_cipher.Init(forEncrypt, new KeyParameter(keyByte));

return _cipher.DoFinal(input);

}

catch (Org.BouncyCastle.Crypto.CryptoException ex)

{

throw new CryptoException(ex.ToString());

}

}



}



BCEngine bc = new BCEngine(new BlowfishEngine());



public string EncodePassword(string input, string salt = "$2a$13$AcDc1326./qZrrFpoXx0$")

{

return bc.Encrypt(input, salt);

}





public string CalculateMD5Hash(string input)

{

// step 1, calculate MD5 hash from input

MD5 md5 = System.Security.Cryptography.MD5.Create();

byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);

byte[] hash = md5.ComputeHash(inputBytes);



return Convert.ToBase64String(hash);

}

}

 

¢£AES°Å¹æ²½¤Î¥µ¥ó¥×¥ë

¡üC#¤Î¥µ¥ó¥×¥ë¤¤¤í¤¤¤í

http://stackoverflow.com/questions/273452/using-aes-encryption-in-c-sharp

http://www.gutgames.com/post/AES-Encryption-in-C.aspx

http://www.c-sharpcorner.com/UploadFile/ahsanshakir/EncryptFile12212006042816AM/EncryptFile.aspx

¤¢¤È¥³¥³¤é¤Ø¤ó¡©¢­

http://msdn.microsoft.com/en-us/library/53tyfkaw(v=vs.100).aspx

http://www.mono-project.com/Cryptography

 

¡üAsset¥Õ¥¡¥¤¥ë¤Î°Å¹æ²½¤Ë¼ÁÌä

http://answers.unity3d.com/questions/8855/how-to-encrypt-asset-bundles.html

¡üC#¥³¡¼¥É¤ÎÆñÆÉ²½¤Ë´Ø¤¹¤ë¥¹¥ì¥Ã¥É

http://forum.unity3d.com/threads/175054-Obfuscation-Community-requested



Unity¤Î¥Æ¥¯¥¹¥Á¥ã¥¢¥Ë¥á¡¼¥·¥ç¥ó¤Î²áµîµ­»ö¤Ë¥¢¥¯¥»¥¹¤¬Â¿¤¤¤Î¤Ç¤¹¤¬¡¢µ­»ö¤Î¾ðÊ󤬾¯¤·¸Å¤¤¤Î¤ÇÊä´°¤·¤Æ

¤ª¤­¤Þ¤¹¡£



¥Õ¥ê¡¼¥¹¥¯¥ê¥×¥È¤ò»ÈÍѤ·¤ÆÏ¢È֥ƥ¯¥¹¥Á¥ã¤ò°ìËç¤Î¥·¡¼¥È¤Ë¤Þ¤È¤á¤ë²Õ½ê¤Ç¤¹¤¬¥Õ¥©¥È¥·¥ç¥Ã¥×¤ËźÉդΥץ饰¥¤¥ó

¡Ö¥³¥ó¥¿¥¯¥È¥·¡¼¥È­¶¡×¤ÇƱ¤¸¤è¤¦¤Ë¥·¡¼¥ÈºîÀ®¤¬¤Ç¤­¤Þ¤¹¡£

¡Ö¥Õ¥¡¥¤¥ë¡×¢ª¡Ö¼«Æ°½èÍý¡×¢ª¡Ö¥³¥ó¥¿¥¯¥È¥·¡¼¥È­¶¡× ¤¬¤½¤ì¤Ç¤¹

¤¿¤À¤·CS4°Ê¹ß¤Ï¥³¥ó¥¿¥¯¥È¥·¡¼¥È­¶¤Î¥×¥é¥°¥¤¥ó¤¬ÉÕ°¤·¤Æ¤¤¤Þ¤»¤ó¡£

¥µ¥¤¥È¤«¤éľÀÜ¥À¥¦¥ó¥í¡¼¥É¤·¤Æ¼«Ê¬¤Ç¥¤¥ó¥¹¥È¡¼¥ë¤¹¤ëɬÍפ¬¤¢¤ë¤è¤¦¤Ç¤¹¡£



¡Ö¥³¥ó¥¿¥¯¥È¥·¡¼¥È­¶¡×¤Î¥À¥¦¥ó¥í¡¼¥ÉÀè ¢­

http://helpx.adobe.com/jp/photoshop/kb/234925.html

¥À¥¦¥ó¥í¡¼¥É¤È»ÈÍÑÊýË¡¤Ï¥Ó¥Ç¥ª±ÇÁü¤ò»²¹Í¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£





¤½¤ì¤È ¤´Â¸ÃΤ«¤â¤·¤ì¤Þ¤»¤ó¤¬ ¥¹¥×¥é¥¤¥È¤Î¥¢¥È¥é¥¹ºîÀ®¤ò¤¹¤ë "shoebox¡É

no title
























http://renderhjs.net/shoebox/

http://forum.unity3d.com/threads/113518-ShoeBox-2d-gamedev-tools Unity¥Õ¥©¡¼¥é¥à¤Î³ºÅöµ­»ö

adobeAir¤ò»ÈÍѤ·¤¿¥Ä¡¼¥ë¤Ç ¥¹¥×¥é¥¤¥È¤Î¥Ñ¥Ã¥­¥ó¥° ¤ä ¥Æ¥¯¥¹¥Á¥ã¤«¤é¤Î¥¹¥×¥é¥¤¥ÈÀÚ¤ê½Ð¤·

¥Æ¥¯¥¹¥Á¥ãºÂɸ¤Î¥ª¥Õ¥»¥Ã¥È¥Æ¡¼¥Ö¥ë½ñ¤­½Ð¤·¤Ê¤É¤ËÂбþ¤·¤¿¤¹¤°¤ì¤â¤Î¡£

¥¹¥¿¥ó¥É¥¢¥í¡¼¥ó¤Çưºî¤¹¤ë¤Î¤Ç¥Õ¥©¥È¥·¥ç¥Ã¥×¤ò»ý¤Ã¤Æ¤¤¤Ê¤¯¤Æ¤âÂç¾æÉס£







¤È¤¤¤¦¤³¤È¤Ç ¡¡¡¡¤¦¤Ë¤Ð¤Ê¥·¥ç¡¼¥Èµ­»ö¤Ç¤·¤¿¡£

¼¡²ó¤Ï¡¡Íè½µ¤«¤Ê¤¢¡¦¡¦

 

 

¤³¤ó¤Ë¤Á¤Ï º£²ó¤Ï¥Ñ¡¼¥Æ¥£¥¯¥ë¤Ê¤É¤Î¥¨¥Õ¥§¥¯¥ÈÍÑ¥·¥§¡¼¥À¡¼¤ò¥Æ¥¹¥È¤Ç½ñ¤¤¤Æ¤ß¤Þ¤·¤¿¡£

ư²è¤Ï¥¤¥á¡¼¥¸±ÇÁü ¥É¥ê¥­¥ã¥¹ÈÇ ÈÃÈ·¤Ç¤¹¡£

¥Ñ¡¼¥Æ¥£¥¯¥ë²Ã»»¡Êadditive¡Ë¥·¥§¡¼¥À¤ÏÌÀ¤ë¤¤Çطʤ˽Ťͤ¿»þ ñ½ã¤ËDst¥«¥é¡¼¡Ê¤³¤³¤Ç¤ÏÇØ·Ê¿§¤Î¤³¤È¡Ë

¤ËÂФ·¤Æ¥¹¥¯¥ê¡¼¥ó²Ã»»¤ò¹Ô¤¦¤¿¤á¥¨¥Õ¥§¥¯¥È¤ò½Å¤Í¤ë¤´¤È¤Ë¿§¤¬Çò¤¯Èô¤Ó¤Þ¤¹¡£¤¤¤ï¤æ¤ë¿Ä¤Î¤Ê¤¤¥¨¥Õ¥§¥¯¥È

¤È¤¤¤¦¤ä¤Ä¤Ç¤¹¡£ ¥·¡¼¥óÇØ·Ê¤ò°Å¤¯¤·¤¿¤ê¤È¤¤¤Ã¤¿¥²¡¼¥àÀ­¤Ë´Ø¤ï¤ëÉôʬ¤ÇÂкö¤ò¤·¤¿¤ê¤â¤¹¤ëÊýË¡¤â¤¢¤ë¤Î¤Ç¤¹¤¬

 

¤³¤ì¤ò²óÈò¤¹¤ë¤¿¤á¤Ë ¤è¤¯»È¤ï¤ì¤ë¼êË¡¤¬²Ã»»¥¨¥Õ¥§¥¯¥È¤Î¸å¤í¤Ë¾è»»¥Æ¥¯¥¹¥Á¥ã¤ò°ìËçÉߤ¯

ÊýË¡¤Ç¡¢¤Þ¤À¸ÇÄꥷ¥§¡¼¥À¤·¤«Ìµ¤«¤Ã¤¿PS2¤ä¥É¥ê¡¼¥à¥­¥ã¥¹¥È¤Î»þ´ü¤Î¥¨¥Õ¥§¥¯¥È¤Ï¤³¤Î¤ä¤êÊý¤¬ÍѤ¤¤é¤ì¤Æ¤¤¤Þ¤·¤¿¡£¡Ê¤³¤³¤ÇÈÃÈ·¤Îư²è¤Î¤É¤³¤Ç»È¤ï¤ì¤Æ¤¤¤ë¤«»²¾È¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡Ë

¤½¤Î¸å ¥×¥í¥°¥é¥Þ¥Ö¥ë¥·¥§¡¼¥À¡¼¤¬ÅëºÜ¤µ¤ì¤¿¼¡À¤Â嵡¤Ë¤Ê¤ë¤È ¾è»»¤È²Ã»»¤Î2¥Ñ¥¹¥·¥§¡¼¥À¡¼¤Ç¿§¤ÎÇò¤È¤Ó¤ò

ÍÞ¤¨¤ëÊýË¡¤¬»È¤ï¤ì¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤·¤¿¡£ º£²ó¤Î¥·¥§¡¼¥À¡¼¤Ï¤³¤Î£²¥Ñ¥¹¤Î¥Ñ¡¼¥Æ¥£¥¯¥ë¥·¥§¡¼¥À¤Ç¤¹¡£

 

Unity¤Ë¥Ó¥ë¥È¥¤¥ó¥·¥§¡¼¥À¡¼¤È¤·¤ÆÉÕ°¤·¤Æ¤¤¤ë¥Ñ¡¼¥Æ¥£¥¯¥ë¥·¥§¡¼¥À¡¼¤Ï¤ª¤ª¤Þ¤«¤Ë²Ã»»¡ÊAddiive)¤È¸º»»¡ÊMultiply)¡£

¤½¤Î¤Û¤«¤ËAdditiveMuitiply¤Î¤è¤¦¤Ê¼ïÎà¤â¤¢¤ê¤Þ¤¹ ¤³¤ì¤Ï1¥Ñ¥¹¤Ç¥Æ¥¯¥¹¥Á¥ã¤ÎÌÀÅÙ¤ò¸«¤ÆÇطʤȲû»¤¹¤ë¤â¤Î¤Ç¿§¤ÏÀµ³Î¤Ë¥Æ¥¯¥¹¥Á¥ã¤Î¿§¤òÈ¿±Ç¤·¤Þ¤¹¤¬°Å¤¤¿§¤ÎÉôʬ¤Ïɽ¼¨¤Ç¤­¤Þ¤»¤ó¡£

º£²ó¤Î¥·¥§¡¼¥À¤Ï¾è»»¤È²Ã»»¤ò½Å¤Í¤ÆÉ½¼¨¤¹¤ë¤¿¤á ¿§¤òÀµ³Îɽ¼¨¤¹¤ë¥Ñ¡¼¥Æ¥£¥¯¥ë¤È¤·¤Æ»ÈÍѤǤ­¤Þ¤¹¡£

¿Þfig1¤ò»²¾È

 

fig1:

AddMulti

¤µ¤é¤Ë

Ä̾ï¤Î¥Ó¥ë¥Ü¡¼¥É¥Æ¥¯¥¹¥Á¥ã¥·¥§¡¼¥À¤È¤·¤Æ¤âµ¡Ç½¤¹¤ë ¥¨¥Õ¥§¥¯¥ÈÍÑÅÓ¤ËÍÍ¡¹»ÈÍѽÐÍè¤ëÍøÊØÀ­¤¬¤¢¤ê¤Þ¤¹¡£

¿Þfig2¤ÎÄ̾亮¥§¡¼¥À¤ò»ÈÍѤ·¤¿¥Æ¥¯¥¹¥Á¥ã¥¤¥á¡¼¥¸¤¬±¦Â¦¤Ç º£²ó¤Î¥·¥§¡¼¥À¤ò»ÈÍѤ·¤¿¥¤¥á¡¼¥¸¤¬º¸Â¦¤Ç¤¹¡£

²Ã»»¤Ë¤è¤Ã¤Æ¥³¥ó¥È¥é¥¹¥È¤¬¶¯Ä´¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ Çúȯ¤Ê¤É¤Î¥Æ¥¯¥¹¥Á¥ã¤òÉÁ²è¤¹¤ë¤Î¤Ë¤â¸ú²Ì¤Ï¤¢¤ê¤½¤¦¤Ç¤¹¡£

¤µ¤é¤Ë¥°¥í¡¼¤Î¥¤¥á¡¼¥¸¥¨¥Õ¥§¥¯¥È¤òÈ碌¤ì¤Ð¥ê¥Ã¥Á¤Ê²èÁü¤¬ÆÀ¤é¤ì¤ë¤«¤È»×¤¤¤Þ¤¹¡£

fig2¡§

tekusutyaAdd

 

¥·¥§¡¼¥À¡¼¤Î¥³¡¼¥É "Custom/AddMultiply+.shader¡É

Shader "Custom/AddMultiply+" {

Properties {
_TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
_MainTex ("Particle Texture", 2D) = "white" {}
_InvFade ("Soft Particles Factor", Range(0.01,3.0)) = 1.0
_Contrast("Contrast Factor", Range(0.5,1.0)) = 0.1
}


CGINCLUDE

#pragma exclude_renderers gles
#pragma target 3.0
#pragma vertex vert
#pragma fragmentoption ARB_precision_hint_fastest
#pragma multi_compile_particles
#include "UnityCG.cginc"


struct appdata_t {
float4 vertex : POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
};

struct v2f {
float4 vertex : POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
#ifdef SOFTPARTICLES_ON
float4 projPos : TEXCOORD1;
#endif
};

float4 _MainTex_ST;

v2f vert (appdata_t v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
#ifdef SOFTPARTICLES_ON
o.projPos = ComputeScreenPos (o.vertex);
COMPUTE_EYEDEPTH(o.projPos.z);
#endif
o.color = v.color;
o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);

return o;
}

sampler2D _CameraDepthTexture;
float _InvFade;

sampler2D _MainTex;
fixed4 _TintColor;
float _Contrast;


float bias (float val, float b)
{
return (b>0) ? pow(abs(val),log(b) / log(0.5)) : 0;
}

float gain (float val, float g)
{
return 0.5 * ((val<0.5) ? bias(2.0*val, 1.0-g) : (2.0 - bias(2.0-2.0*val, 1.0-g)));
}


ENDCG


Category {
Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) }
BindChannels {
Bind "Color", color
Bind "Vertex", vertex
Bind "TexCoord", texcoord
}

SubShader {

Pass {

Blend Zero SrcColor

CGPROGRAM

#pragma fragment frag


fixed4 frag (v2f i) : COLOR
{
#ifdef SOFTPARTICLES_ON
float sceneZ = LinearEyeDepth (UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))));
float partZ = i.projPos.z;
float fade = saturate (_InvFade * (sceneZ-partZ));
i.color.a *= fade;
#endif

half4 prev = i.color * tex2D(_MainTex, i.texcoord);

prev.r =gain( prev.r , _Contrast);
prev.g =gain( prev.g , _Contrast);
prev.b= gain( prev.b , _Contrast);

return lerp(half4(1,1,1,1), prev, prev.a);
}
ENDCG

SetTexture [_MainTex] {
combine texture * primary
}
SetTexture [_MainTex] {
constantColor (1,1,1,1)
combine previous lerp (previous) constant
}


}//pass



Pass {


Blend SrcAlpha One
AlphaTest Greater .01
ColorMask RGB


CGPROGRAM

#pragma fragment frag



fixed4 frag (v2f i) : COLOR
{
#ifdef SOFTPARTICLES_ON
float sceneZ = LinearEyeDepth (UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))));
float partZ = i.projPos.z;
float fade = saturate (_InvFade * (sceneZ-partZ));
i.color.a *= fade;
#endif

fixed4 prev = 2.0f * i.color * _TintColor * tex2D(_MainTex, i.texcoord);

prev.r =gain( prev.r , _Contrast);
prev.g =gain( prev.g , _Contrast);
prev.b= gain( prev.b , _Contrast);

return prev;

}
ENDCG

SetTexture [_MainTex] {
constantColor [_TintColor]
combine constant * primary
}
SetTexture [_MainTex] {
combine texture * previous DOUBLE
}

}
}

}

}

 

¥·¥§¡¼¥À¡¼¤Î´ðËÜŪ¤Ê¹½Â¤¤Ï¥Ó¥ë¥È¥¤¥ó¥·¥§¡¼¥À¡¼¤Î¥½¡¼¥¹¥³¡¼¥É¡ØParticleAdd.shader¡Ù¡ØParticleMultiply.shader¡Ù

¤ò2¥Ñ¥¹¤ÇÎóµó¤·¤¿¤À¤±¤Ç¤¹¡£¥·¥§¡¼¥À¡¼¤Î¥Ñ¥¹¤Ï²¼¤Ë¹Ô¤¯¤Û¤É¥«¥á¥é¤«¤é¸«¤Æ¼êÁ°¤Ë¸þ¤«¤Ã¤Æ¾åÉÁ¤­¤µ¤ì¤Æ¤¤¤­¤Þ¤¹¡£

¡üUnity¤ÎShaderLab¤Ç¤ÏCg¥³¡¼¥É¤Îµ­½Ò¤ÏCGPROGRAM~ENDCG ´Ö¤È¤¤¤¦·è¤Þ¤ê¤¬¤¢¤ê¤Þ¤¹¤¬

Shader¤ÎÆâÉô¤Ç²¿ÅÙ¤«¸Æ¤Ó½Ð¤µ¤ì¤ëÊÑ¿ô¤ä´Ø¿ô¤òµ­½Ò¤¹¤ë¾ì¹ç¤ÏCGINCLUDE~ENDCG ¤ò»ÈÍѤ·¤Þ¤¹¡£

Cg¤Î¥é¥¤¥Ö¥é¥ê¤Î¥¤¥ó¥¯¥ë¡¼¥É#include¡ÉUnityCG.cginc¡É¤ä#pragma¤Î¥ª¥×¥·¥ç¥óÀßÄê¤Ê¤É¤âCGINCLUDEÆâ¤Ë

¤Þ¤È¤á¤Æµ­½Ò¤·¤Æ¤·¤Þ¤¤¤Þ¤¹¡£

 

¡ü#ifdef SOFTPARTICLE_ON ~#endif ¹Ô¤Ï¥½¥Õ¥È¥Ñ¡¼¥Æ¥£¥¯¥ë»ÈÍѤΥ֡¼¥ê¥¢¥óÃͤò¥Á¥§¥Ã¥¯¤·¤Æ¤¤¤Þ¤¹

¥½¥Õ¥È¥Ñ¡¼¥Æ¥£¥¯¥ë¤Ï¥ª¥Õ¥¹¥¯¥ê¡¼¥ó¥Ñ¡¼¥Æ¥£¥¯¥ë¤Ë´Ø¤¹¤ë²áµîµ­»ö¤Ç²òÀ⤷¤Æ¤¤¤Þ¤¹¤¬¿¼Å٥ƥ¯¥¹¥Á¥ã

¡ÊCameraDepthTexture)¤ÎÃͤò´ð¤Ë¥Ô¥¯¥»¥ë¥«¥é¡¼¤Î¥¢¥ë¥Õ¥¡ÃͤòÀßÄꤹ¤ë¤â¤Î¤Ç¤¹¡£

¤³¤Î¹Ô¤Ï¥·¥§¡¼¥ÀÆâ¤Ç2²ó¸Æ¤Ó½Ð¤µ¤ì¤Æ¤¤¤Þ¤¹¤¬ CGINCLUDEʸ¤ÎÃæ¤Ë¤Þ¤È¤á¤Æ¤·¤Þ¤Ã¤Æ¹½¤¤¤Þ¤»¤ó¡£

¢¨¤Á¤ç¤Ã¤È»þ´Ö¤¬¤Ê¤«¤Ã¤¿¤â¤Î¤Ç¼ê¤¬²ó¤ê¤Þ¤»¤ó¤Ç¤·¤¿

 

¡ü¥Æ¥¯¥¹¥Á¥ã¥«¥é¡¼¤Ë¥Ð¥¤¥¢¥¹ÃÍ¡Ê_Contrast)¤ò³Ý¤±¤Æ¿§¤ò»ý¤Á¾å¤²¤ë¤³¤È¤¬¤Ç¤­¤ë¤è¤¦¤Ë¤·¤Æ¤¢¤ê¤Þ¤¹¡£

Pow¡Ê¡Ë¤Ê¤É¤ò»ÈÍѤ·¤Æ¤â¤¦¤¹¤³¤·Ã»¤¤¥³¡¼¥É¤Ë¤â¤Ç¤­¤Þ¤¹¤¬¡¢Í½ÁÛ¤·¤Æ¤¤¤¿¿§Ì£¤Ë¤Ê¤é¤Ê¤«¤Ã¤¿¤Î¤Çbias()´Ø¿ô

¤òÀßÄꤷ¤Æ¤¤¤Þ¤¹¡£¤³¤³¤ÏºÇŬ²½¤·¤¿¤Û¤¦¤¬¤¤¤¤¤«¤â¤·¤ì¤Þ¤»¤ó¡£

 

ºÇ¸å¤Ë¤Ê¤ê¤Þ¤·¤¿¤¬Unity¤Ï¥Þ¥Æ¥ê¥¢¥ë¥¹¥í¥Ã¥È¤ÇÊ£¿ô¥Þ¥Æ¥ê¥¢¥ë¤ò»ØÄꤹ¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¤Î¤Ç ¿Þfig3

¤Î¤è¤¦¤Ë¥Þ¥Æ¥ê¥¢¥ë¤ò2¤ÄÅÐÏ¿¤¹¤ë¤³¤È¤ÇƱ¤¸¤è¤¦¤Ê¸ú²Ì¤òÆÀ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤¹¡£ Unity¤ÏÃμ±¤Î¤Ê¤¤¥æ¡¼¥¶¡¼¤Ë¤â

ÍÍ¡¹¤Ê²óÈòÊýË¡¤¬ÍѰդµ¤ì¤Æ¤¤¤Æ½õ¤«¤ê¤Þ¤¹¡£

¤³¤Î¤È¤­¤Ë¥·¥§¡¼¥À¡¼¥Ñ¥¹¤ÈƱÍͤ˾å¤ËÅÐÏ¿¤·¤¿¤â¤Î¤¬Àè¤ËÉÁ²è¤µ¤ì¤ë¤³¤È¤Ëµ¤¤ò¤Ä¤±¤Æ¤¯¤À¤µ¤¤¡£

fig3:

MaterialSlot

 

Êä­¡Ë

¥Þ¥Æ¥ê¥¢¥ë¤òÊ£¿ô»È¤¦¾ì¹ç Unity¤Î¥À¥¤¥Ê¥ß¥Ã¥¯¥Ð¥Ã¥Á¤¬Å¬ÍѤµ¤ì¤Ê¤¤¤¿¤á¥É¥í¡¼¥³¡¼¥ë¤ÏÅöÁ³¤Ç¤¹¤¬Ä̾ï¤ËÈæ¤Ù¤Æ2ÇÜȯÀ¸¤·¤Þ¤¹¡£ ¤â¤Á¤í¤óº£²ó¤Î¥·¥§¡¼¥À¡¼¤â2¥Ñ¥¹¤Ç¤¹¤Î¤Ç ¥É¥í¡¼¥³¡¼¥ë¡ß£²-¥À¥¤¥Ê¥ß¥Ã¥¯¥Ð¥Ã¥Á¡Ê´üÂÔ¤µ¤ì¤ë¥É¥í¡¼¥³¡¼¥ë¤Îºï¸º¡Ë ¤È¤Ê¤ë¤ï¤±¤Ç¤¹¤¬¡¢ ¤³¤ì¤ÏÆâ¡¤Î¥Ñ¡¼¥Æ¥£¥¯¥ë¥¨¥Ç¥£¥¿¤ò»ÈÍѤ¹¤ë¾ì¹ç¤ÎÃͤǤ¹¡£

¥Ñ¡¼¥Æ¥£¥¯¥ë¼«ÂÎ¤Î¥É¥í¡¼¥³¡¼¥ë¤ò¸º¤é¤¹Êý¸þ¤Ç´ö¤Ä¤«¹Í¤¨¤é¤ì¤ë¼êË¡¤¬¤¢¤ê¤Þ¤¹¡£

 

¡üGPU¥·¥§¡¼¥À¤Ç¥Ñ¡¼¥Æ¥£¥¯¥ë¤òÉÁ²è¤¹¤ëÊýË¡¡£ À¸À®¤µ¤ì¤¿¥Æ¥¯¥¹¥Á¥ã¤ò¥Õ¥ì¡¼¥à¥Ð¥Ã¥Õ¥¡¤ËŸ³«¤¹¤ë¤À¤±¤Ç¤¹¤Î¤Ç

¥Ñ¡¼¥Æ¥£¥¯¥ë¤¹¤Ù¤Æ¤ò1¥Ñ¥¹¤Ç¥ì¥ó¥À¥ê¥ó¥°¤¹¤ë¤Î¤ÈƱÅù¤Ç¤¹¡£ ¥Ñ¡¼¥Æ¥£¥¯¥ë¤Î·×»»¤âGPU¤Ç¹Ô¤Ê¤Ã¤Æ¤·¤Þ¤¦¤¿¤á

¹â®¤Ê¥Ñ¡¼¥Æ¥£¥¯¥ë¥ì¥ó¥À¥é¡¼¤¬½ñ¤±¤ë¤È»×¤¤¤Þ¤¹¡£

¡üSHURIKEN¤Ê¤É¥Ñ¡¼¥Æ¥£¥¯¥ë¥¨¥Ç¥£¥¿¡¼¤«¤éºÂɸ¥Ç¡¼¥¿¤À¤±¤ò¼èÆÀ¤·¤Æ¥·¥§¡¼¥À¡¼¤Ç°ìËç¤Î¥¹¥¯¥ê¡¼¥ó¥Æ¥¯¥¹¥Á¥ã¤Ë

¤Þ¤È¤á¤ÆÉÁ²è¤¹¤ëÊýË¡¡£ ¹Í¤¨Êý¤Ï¥¤¥á¡¼¥¸¥¨¥Õ¥§¥¯¥È¤Ë¶á¤¤¤Ç¤¹¡£¥¨¥Ç¥£¥¿¡¼¤ò¼«Á°¤ÇÍѰդ¹¤ë¼ê´Ö¤¬¤«¤«¤ê¤Þ¤»¤ó¡£

¡ü¥Ó¥ë¥Ü¡¼¥É¥Ý¥ê¥´¥ó¤Îɽ¼¨¤ò¹â®²½¤¹¤ëÊýË¡¡£ unity¤Î¥Õ¥©¡¼¥é¥à¤Ç¥Þ¥¤¥ó¥¯¥é¥Õ¥È¤Î¥Æ¥ó¥×¥ì¡¼¥È¤ò¼èÆÀ¤·¤¿Êý¤Ï¤ï¤«¤ë¤«¤È»×¤¤¤Þ¤¹¤¬

¥Ý¥ê¥´¥ó¥á¥Ã¥·¥å¥Ç¡¼¥¿¤ÏMeshRenderer¤Ë¥»¥Ã¥È¤µ¤ì¤¿¥á¥Ã¥·¥åÇÛÎó¤Ë¤è¤Ã¤ÆÉÁ²è¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

¥á¥Ã¥·¥åÉÁ²è¤Î¹â®²½¼êË¡¤È¤·¤Æ¤ÏÎ㤨¤ÐMeshMerger¥¹¥¯¥ê¥×¥È¤Ç¤ÏStart()»þ¤Ë¥â¥Ç¥ë¥á¥Ã¥·¥å¤ò°ì¤Ä¤ÎÇÛÎó¤Ë¤Þ¤È¤á¤ÆMeshRender¤ËžÁ÷¤·¤Æ¤¤¤Þ¤¹¡£

¤³¤ÎÊýË¡¤Ç¤Ïư¤­¤Î¤¢¤ë¥á¥Ã¥·¥å¥ª¥Ö¥¸¥§¥¯¥È¤òËè²óžÁ÷¤¹¤ë¤Î¤Ï¥³¥¹¥È¤¬¹â¤¤¤Î¤Ç¡¢Mesh ¥Ç¡¼¥¿¤Ë¥¤¥ó¥Ç¥Ã¥¯¥¹¤ò¤Ä¤±¤Æ´ÉÍý¤¹¤ë¤³¤È¤Ç ¥¤¥ó¥Ç¥Ã¥¯¥¹¤ËÏ¢¤Ê¤ë¥á¥Ã¥·¥å¥Ç¡¼¥¿¤Î¤ß¤òľÀÜÁàºî¤¹¤ë¤³¤È¤Ç®Å٤βþÁ±¤ò¤Ï¤«¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

¥á¥Ã¥·¥å¥Ç¡¼¥¿¤Î°ÜưÊÑ´¹¤ÏĺÅÀ¥Ç¡¼¥¿¤Ë¥È¥é¥ó¥¹¥Õ¥©¡¼¥à¤Î¥Þ¥È¥ê¥Ã¥¯¥¹ ¤òÄ̤¹¤À¤±¤Ç¤¹¡£

¤ª¤½¤é¤¯£²DGUI¤ÎºÇŬ²½¤Ë¤â¤³¤Î¤è¤¦¤Ê¤ä¤êÊý¤¬ÍѤ¤¤é¤ì¤Æ¤¤¤ë¤Î¤Ç¤Ï¤Ê¤¤¤Ç¤·¤ç¤¦¤«¡£

 

¤Ê¤É¤Ê¤ÉºÇŬ²½¼êË¡¤ÏÍÍ¡¹¤¢¤ë¤È»×¤ï¤ì¤Þ¤¹¤Î¤Ç ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î·ÁÂ֤˹ç¤ï¤»¤ÆÁªÂò¤¹¤ë¤È¹¬¤»¤«¤â¤·¤ì¤Þ¤»¤ó¡£

 

 

 

 

¤È¤¤¤¦¤ï¤±¤Ç¥¨¥Õ¥§¥¯¥È¤ËÊØÍø¤½¤¦¤Ê¥·¥§¡¼¥À¡¼¤ò½ñ¤¤¤Æ¤ß¤¿¤Î²ó¤Ç¤·¤¿¡£¥¨¥Õ¥§¥¯¥È¤ÎºîÀ®ÊýË¡¤Ï¤Þ¤¿¤¤¤º¤ì

¤ä¤Ã¤Æ¤¤¤³¤¦¤«¤È»×¤¤¤Þ¤¹¤¬ ¤È¤Ë¤«¤¯¤â»þ´Ö¤¬¤Ê¤¤¤Î¤Ç¤¤¤Ä¤Ë¤Ê¤ë¤ó¤Ç¤·¤ç¤¦¤Í¤§£÷

¤½¤ì¤«¤éÇØ·Ê´ØÏ¢¤Îµ­»ö¤Ç¤¹¤¬ ͽÄê¤ÎÇØ·Ê¥·¥§¡¼¥À¡¼¤ò¤¤¤í¤¤¤í¤È½ñ¤¤¤Æ¥Æ¥¹¥È¤·¤Æ¤¤¤ë´Ø·¸¤Ç¤Á¤ç¤Ã¤È»þ´Ö¤«¤«¤Ã¤Æ¤¤¤Þ¤¹¤¬ ¶á¤¤¤¦¤Á¤Ë¥¢¥Ã¥×¤·¤è¤¦¤È»×¤Ã¤Æ¤¤¤Þ¤¹¡£

¥·¥§¡¼¥À°Ê³°¤Ç¤â¼ÁÌ䤬¤¢¤ì¤Ð ¥³¥á¥ó¥È¤·¤Æ¤¤¤¿¤À¤±¤ì¤Ðʬ¤«¤ëÈϰϤDzóÅú¤·¤Æ¤¤¤­¤Þ¤¹¤Î¤Ç ¤´¼«Í³¤Ë¤É¤¦¤¾¡£

¤Ç¤Ï¤Þ¤¿


¡ÚÄɵ­¡Û

¡Ê13.¡¡12.12¡Ë¡¡´ØÏ¢µ­»ö¤ò¹¹¿·¤·¤Þ¤·¤¿
¤¦¤Ë¤Ð¤Ê¡¡¡Ê¥¨¥Õ¥§¥¯¥ÈÍѤΥ·¥§¡¼¥À¤Ë´Ø¤¹¤ë¥¢¥¤¥Ç¥¢£±¡Ü¡Ë
http://blog.livedoor.jp/akinow/archives/52389229.html

¤¦¤Ë¤Ð¤Ê¡¡¡Ê¥¨¥Õ¥§¥¯¥ÈÍѤΥ·¥§¡¼¥À¤Ë´Ø¤¹¤ë¥¢¥¤¥Ç¥¢£²¡Ë
http://blog.livedoor.jp/akinow/archives/52372883.html



Á°²ó¹¹¿·¤«¤é´Ö¤¬³«¤¤¤Æ¤·¤Þ¤¤ ¿½¤·Ìõ¤Ê¤¤¤Ç¤¹¡£ ¥·¥§¡¼¥À¡¼¤«ÇطʤÈͽ¹ð¤·¤¿¤Î¤Ç¤¹¤¬

Sendmessage¡Ê¡Ë¥á¥½¥Ã¥É¤Î¸¡º÷¤¬Â¿¤«¤Ã¤¿¤Î¤Ç¤Á¤ç¤Ã¤È´ó¤êÆ»¤·¤Æ¡¡¥Ç¡¼¥¿ºÇŬ²½¤ÎÏäò¤·¤Þ¤¹

¥³¡¼¥É¤òåºÎï¤Ë¸«¤»¤ë¥¹¥¯¥ê¥×¥È¤òµ­»ö¤ËËä¤á¹þ¤à¤È;͵¤Îʸ»ú¿ô¥ª¡¼¥Ð¡¼¤·¤Æ¤·¤Þ¤¦¤Î¤Ç¸«¤Å¤é¤¤¤Î¤Ï
´ªÊÛ¤·¤Æ²¼¤µ¤¤¡£¡¡¿§¤È¤«¤³¤ê¤¿¤¤¤ó¤Ç¤¹¤±¤É¡¡µ­»ö¤Î¥Ç¡¼¥¿ÎÌÀ©¸Â¤¬¤­¤Ó¤·¤¯¤Æ¤Í¡¡¥·¥ó¥×¥ë¤Ë¤Ê¤é¤¶¤ë¡£





¢£Sendmessage()¤ÇÊ£¿ô¤ÎÃͤòÁ÷¿®¤¹¤ëÊýË¡

Sendmessage ¡Ê¡Ë¤ÇÊ£¿ô¤ÎÃͤòÁ÷¿®¤¹¤ë¤Ë¤Ï ÇÛÎó¡¢¥¯¥é¥¹¤Ê¤É¤òÍøÍѤ·¤Þ¤¹



¡üÇÛÎó¤ò»ÈÍѤ¹¤ë¾ì¹ç

¡üÁ÷¿®Â¦

var goTo : Vector3;
var arr = new Array();

arr.Push (goTo);
arr.Push (true);
other.SendMessage ("GoTo", arr);



¡ü¼õ¿®Â¦


function GoTo(arr){
var dest : Vector3;
var input : boolean;

dest = arr[0];
input = arr[1];
}




¡ü¥¯¥é¥¹¤ò»ÈÍѤ¹¤ë¾ì¹ç

¡ü¥¯¥é¥¹¤ÎÀë¸À

public class DamageParams
{
public var damage : float = 0.0;
public var type : int = 0;
public var source : NetworkPlayer = Network.player;

//¥³¥ó¥¹¥È¥é¥¯¥¿¤³¤³¤«¤é
function damageParams( damage : float, type : int, source : NetworkPlayer)
{ this.damage = damage; this.type = type; this.source = source; }
}


¡üÁ÷¿®Â¦

function dealDamage( other : GameObject )
{ other.SendMessage( "takeDamage", new DamagePrams(10, 2, Network.player) ); }


¡ü¼õ¿®Â¦

function takeDamage( params : DamageParams )
{
if(params.type != 3)
health -= params.damage;
}


»²¾È¡§http://answers.unity3d.com/questions/170384/multiple-paramaters-with-send-message.html


¡üNotificationCenter¡ÊÄÌÃÎ¥»¥ó¥¿¡¼¡Ë
Unity¸ø¼°¤Î¥Õ¥©¡¼¥é¥àWiki ¤Ëµ­½Ò¤¬¤¢¤ê¤Þ¤¹¤¬NotificationCenterľÌõ¤À¤ÈÄÌÃÎ¥»¥ó¥¿¡¼¤ò»ÈÍѤ·¤¿

SendMessage¤ò¸úΨ¤è¤¯¥ª¥Ö¥¸¥§¥¯¥È´Ö¤ÇÁ÷¿®¤¹¤ë¥¹¥¯¥ê¥×¥È¤¬¤¢¤ê¤Þ¤¹¡£ ¢¨¥ê¥ó¥¯Àè¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤

http://wiki.unity3d.com/index.php?title=NotificationCenter
http://wiki.unity3d.com/index.php/NotificationCenter3_5
http://wiki.unity3d.com/index.php?title=NotificationCenterGenerics


¤³¤ì¤Ï ¤¢¤é¤«¤¸¤áÄÌ¿®¤µ¤»¤¿¤¤GameObject¤òÇÛÎó¤ËÅÐÏ¿¤·¤Æ¤ª¤±¤Ð¸úΨ¤è¤¯¥Ç¡¼¥¿Á÷¿®¤Ç¤­¤ë¤È¤¤¤¦¥¹¥¯¥ê¥×¥È¤Ç¤¹¡£

¥«¥¹¥¿¥Þ¥¤¥º¤µ¤ì¤ÆÊ£¿ô¤Î¥¿¥¤¥×¤¬Â¸ºß¤·¤Þ¤¹¤¬ ¥¸¥§¥Í¥ê¥Ã¥¯·¿Hash¥Æ¡¼¥Ö¥ë¤ò»ÈÍѤ·¤¿¥¿¥¤¥×¤¬°·¤¤¤ËÊØÍø¤½¤¦¤Ç¤¹




¡ü¥×¥í¥°¥é¥Þ°Ê³°¤ÎÊý¤Ë¤â¤ï¤«¤ë¤è¤¦¤Ë°ì±þ²òÀ⤷¤Þ¤¹¤è

¥¹¥¯¥ê¥×¥È¤Ï ¥·¥ó¥°¥ë¥È¥ó¥Ñ¥¿¡¼¥ó ¤Çµ­½Ò¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

¥·¥ó¥°¥ë¥È¥ó¤È¤¤¤¦¤Î¤ÏÊ£»¨¤Ê½èÍý¤ò¹Ô¤¦¥á¥½¥Ã¥É¤Ç¥·¡¼¥ó¤ÎÃæ¤Ë¾ï¤Ë£±¤Ä¤À¤±Â¸ºß¤µ¤»¤¿¤¤¥¹¥¯¥ê¥×¥È¤ò°·¤¦¾ì¹ç¤Ë»ÈÍѤµ¤ì¤ëµ­½ÒË¡¤Ç¤¹¡£



¥·¥ó¥°¥ë¥È¥ó¥Ñ¥¿¡¼¥ó¤ÎÎã¡Ë

using UnityEngine;
public class MySingleton : MonoBehaviour
{
private static MySingleton instance;
public static MySingleton Instance
{
get
{
if (instance == null)
//¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°»þ¤Ë¤³¤Î¥·¥ó¥°¥ë¥È¥ó¥¯¥é¥¹¡Ê¡ÉMy¡¦¡¦¡É¡Ë¤¬Â¸ºß¤·¤Ê¤±¤ì¤ÐGameObject¤òÀ¸À®¤·¤Æ¥³¥ó¥Ý¡¼¥Í¥ó¥ÈÄɲÃ
{
instance = new GameObject ("MySingleton").AddComponent ();
}
return instance;
}
}
public void OnApplicationQuit () // ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î½ªÎ»»þ¤Ë¤³¤Î¥³¥ó¥Ý¡¼¥Í¥ó¥È¤òºï½ü
{
instance = null;
}
}


»²¾È¡§http://wiki.unity3d.com/index.php/Singleton

¥·¥ó¥°¥ë¥È¥ó¥Ñ¥¿¡¼¥ó¤Î¥¹¥¯¥ê¥×¥È¤Ï¥·¡¼¥óÃæ¤ËÃÖ¤¤¤Æ¤ª¤¯É¬ÍפϤʤ¯¤Æ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡Ê¥²¡¼¥à¡Ëµ¯Æ°»þ¤Ë¼«Æ°¤Ç¥¤¥ó¥¹¥¿¥ó¥¹¤¬À¸À®¤µ¤ì¤Æ ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î½ªÎ»»þ¤ËÇË´þ¤µ¤ì¤Þ¤¹¡£

¥ê¥ó¥¯Àè¤Ë¥«¥¹¥¿¥Þ¥¤¥º¤µ¤ì¤¿¤µ¤ì¤¿¥·¥ó¥°¥ë¥È¥ó¥Ñ¥¿¡¼¥ó¤ÎÎ㤬¤¢¤ê¤Þ¤¹¤Î¤Ç»²¹Í¤Ë¤·¤Æ¤¯¤À¤µ¤¤

¢¨Îã¤ÏC#¤Ç¤¹¤¬UnityScrip£ô¤Ë½ñ¤­´¹¤¨¤ë¤È¤­¤ËÃí°Õ¤¹¤ë¤Î¤Ï¥¢¥¯¥»¥µ¡¼¡Êget / set¡Ë¤Ç¤¹¡£C#¤«¤éUnityScript¤Ø°Ü¿¢¤¹¤ë¤È¤­¤ËǺ¤ó¤ÀÊý¤â¤¤¤ë¤Î¤Ç¤Ï¤Ê¤¤¤Ç¤·¤ç¤¦¤«¡£

¥¢¥¯¥»¥µ¤ÏC#¸ÇÍ­¤Î¤â¤Î¤ÇJava¤äC++¤Ë¤Ï¤¢¤ê¤Þ¤»¤ó¤¬ UnityScript¤Ç¤Ï¥á¥½¥Ã¥É¤¬ÍѰդµ¤ì¤Æ¤¤¤Þ¤¹


Îã¡Ë UnityScript¤Î¾ì¹ç

class JSClass extends MonoBehaviour
{
var x: String = '';
function get X() : String { return x; }
function set X(value : String) { x = value; }
}




¡ü set { set¥¢¥¯¥»¥µ¡¼¡Êsetter ¡Ë ÃͤÎÊѹ¹»þ¤Î½èÍý¤ò½ñ¤¯ value ¤È¤¤¤¦Ì¾Á°¤ÎÊÑ¿ô¤ËÂåÆþ¤µ¤ì¤¿Ãͤ¬³ÊǼ¤µ¤ì¤ë¡£ }
¡ü £çet { get¥¢¥¯¥»¥µ¡¼ ¡Êgetter ¡Ë ÃͤμèÆÀ»þ¤Î½èÍý¤ò½ñ¤¯ ¥á¥½¥Ã¥É¤Î¾ì¹ç¤ÈƱÍͤˡ¢ÃͤÏreturn¥­¡¼¥ï¡¼¥É¤òÍѤ¤¤ÆÊÖ¤¹ }


Îã¤Î¤è¤¦¤Ëfunction¤ò¤Ä¤±¤Æ¥¯¥é¥¹¤ÎÆâÉô¤Ç»ÈÍѤ·¤Þ¤¹¡£

Nofitication Center¤Ë´Ø¤·¤ÆËܲȥե©¡¼¥é¥à¤Î¥¹¥ì¥Ã¥É¤ÇStaticÊÑ¿ô¤ò»ÈÍѤ·¤ÆÃͤò¤ä¤ê¼è¤ê¤¹¤ë¤Î¤È¤É¤Á¤é¤¬¤¤¤¤¤Î¤«¤È¤¤¤¦µÄÏÀ¤¬¤Ê¤µ¤ì¤Æ¤¤¤Þ¤¹¤¬ staticÊÑ¿ô¤Ï¥á¥â¥ê¾ïÃ󤷤Ƥ·¤Þ¤¦¤Î¤Ç¥á¥â¥ê¤Î´ÉÍý¤¬É¬ÍפˤʤëÅÀ¤¬ÌäÂê

¥á¥â¥ê¤Ë´Ø¤·¤Æ¤Ï»È¤ï¤Ê¤¤ÊÑ¿ô¤Ë¤Ïnull¤òÂåÆþ¤·¤Æ¤ª¤¯¤Ê¤É¥ª¡¼¥½¥É¥Ã¥¯¥¹¤Ê¼êË¡¤ÇÂбþ½ÐÍè¤Þ¤¹¤¬ ·ëÏÀ¤È¤·¤Æ¤Ï

¥±¡¼¥¹¥Ð¥¤¥±¡¼¥¹¤«¤Ê£÷ Nofitication Center¤ò»ÈÍѤ·¤¿¥µ¥ó¥×¥ë¤Ï¤¤¤Þ¤Þ¤Ç°ìÎã¡Ê¥Ç¥¸¥¿¥ë¥Á¥å¡¼¥¿¡¼¤Î¥Á¥å¡¼¥È¥ê¥¢¥ë¡Ë¤·¤«¸«¤¿¤³¤È¤¬¤Ê¤«¤Ã¤¿¤ê¤Ê¤Î¤Ç ¤Û¤ó¤È¤Ë¤³¤ì»È¤ï¤ì¤Æ¤ë¤Î¤«¤·¤é¤È¤¤¤¦µ¿Ìä¤â¤¢¤Ã¤¿¤ê¡£¡£



¤È ¤³¤³¤Þ¤ÇSendMessage ()¤Î²òÀâ¤Ç¤·¤¿ ¤¬ Unity¤Î¥³¥ß¥å¥Ë¥Æ¥£Wiki ¤ÎGeneral Performance Tips¤Ë¤è¤ë¤È

http://wiki.unity3d.com/index.php/General_Performance_Tips

SendMessage ()¥á¥½¥Ã¥É¤Ï ¤¢¤Þ¤ê¹â®¤Ç¤Ï¤Ê¤¯£±Å٤Υ³¡¼¥ë¤Ç¥À¥¤¥ì¥¯¥È¤Ë¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò»ØÄꤹ¤ë¸Æ¤Ó½Ð¤·¤ËÈæ¤Ù¤Æ£±£°£°¥µ¥¤¥¯¥ë¤°¤é¤¤ÃÙ¤¤¤è ¤À¤«¤é¤¢¤ó¤Þ¤ê»È¤ï¤Ê¤¤¤Û¤¦¤¬¤¤¤¤¤è

Ū¤Ê¤³¤È¤¬½ñ¤«¤ì¤Æ¤¤¤Þ¤¹¡£ ¤Ê ¤Ê¤ó¤À¤Ã¤Æ¡¼ ¡ÊÀè¤Ë¸À¤¨(# Žß§¥Žß)

100¥µ¥¤¥¯¥ë¤Ã¤Æ²¿¤ò´ð½à¤Ë¤·¤Æ¤ë¤ó¤Ç¤·¤ç¤¦¤Í¡©



¤Ç¤ÏSendMessage¡Ê¡Ë¤Ï»È¤¨¤Ê¤¤¤Î¤«¤È¤¤¤¦¤È¤½¤¦¤¤¤¦¤ï¤±¤Ç¤â¤Ê¤¯¤Æ¥ª¥Ö¥¸¥§¥¯¥È¿ô¤¬¾¯¤Ê¤¤»þ¤ä½èÍý¤Ë;͵¤¬¤¢¤ë¤È¤­¤Ï´ÊÃ±ÊØÍø¤Ê¤Î¤ÇÌäÂê¤Ê¤¤¤È»×¤¤¤Þ¤¹¡£ ¤¢¤È¥³¥ó¥Ý¡¼¥Í¥ó¥È¤òľÀܸƤӽФ»¤Ê¤¤¾ì¹ç Î㤨¤ÐStart¡Ê¡Ë¤Ç¾¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¸Æ¤Ó½Ð¤¹¤È¤­¤Ë½èÍý¤¬¥³¥±¤ë¾ì¹ç¤¬¤¢¤Ã¤Æ ¤½¤¦¤¤¤¦¾ì¹ç¤ÏSendMessage¡Ê¡Ë¤Ê¤éÄÌÃΤ¬Ä̤俤ꤷ¤Þ¤¹ Ææ¤Ç¤¹¤¬¡£ Á᤹¤®¤ë¤Î¤â¤¤¤±¤Ê¤¤¤Î¤«¡©



General Performance Tips ¤Ë¾¤Ë¤âÍ­¸ú¤½¤¦¤Ê¾ðÊ󤬽ñ¤¤¤Æ¤¢¤ê¤Þ¤·¤¿


¡ÖFind·Ï´Ø¿ô¤Ï¼Â¹Ô¤¬ÃÙ¤¤¤Î¤Ç °ìÅÙFind¸¡º÷¤·¤¿¤é¤½¤Î·ë²Ì¤ò¥×¡¼¥ë¤·¤Æ¤ª¤¯¤È¤è¤¤¡£¡×

Find´ØÏ¢¥á¥½¥Ã¥É¤â¼Â¹Ô®ÅÙ¤¬ÃÙ¤¤¤Î¤Ç¤¹¤¬ ¥·¡¼¥óÁ´ÂΤò¥µ¡¼¥Á¤¹¤ë¤Î¤Ç¥ª¥Ö¥¸¥§¥¯¥È¤¬Â¿¤¤¤Û¤É½Å¤¯¤Ê¤ê¤Þ¤¹¡£

¤½¤³¤ÇFind¥á¥½¥Ã¥É¤ÏAwake()¤Þ¤¿¤ÏStart¡Ê¡ËÊ¸Ãæ¤Ç»ÈÍѤ·¤ÆÇÛÎó¤Ë³ÊǼ¤·¤Æ¤ª¤­¼Â¹Ô»þ¤Ë¤ÏFind¥á¥½¥Ã¥É¤ÎÂå¤ï¤ê¤ËÇÛÎó¤ò»²¾È¤¹¤ë¤³¤È¤Ç½èÍý®Å٤θþ¾å¤¬´üÂÔ½ÐÍè¤Þ¤¹¡£

»öÁ°¤Ë¥ª¥Ö¥¸¥§¥¯¥È¤òÇÛÎó¤ËÅÐÏ¿¤·¤Æ¤ª¤¯»ÅÁȤߤò ¡Ö¥ª¥Ö¥¸¥§¥¯¥È¥×¡¼¥ë¡×¤È¸Æ¤ó¤À¤ê¤·¤Þ¤¹¡£





¢£¥ª¥Ö¥¸¥§¥¯¥È¥×¡¼¥ë


¼ÂÁõÊýË¡¡Ë


Instantiate ¤È Destroy ¤Î¥á¥½¥Ã¥É¤ÏξÊý¤È¤â½Å¤¿¤¤½èÍý¤Ç¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¼Â¹ÔÃæ¤ËÁàºî¤ò¹Ô¤¦¤È½èÍýÉé²Ù¤¬¹â¤¤¤Î¤Ç

Instantiate¤Ç°ìÅÙºîÀ®¤·¤¿¥³¥Ô¡¼Prefab¤òÇÛÎó¤ËÅÐÏ¿¤·¤Æ¤ª¤­ SetActiveRecursively¡Ê¡Ë¤ò»ÈÍѤ·¤Æ¥â¥Ç¥ë¤òÈóɽ¼¨¾õÂ֤ˤ·¤Þ¤¹¡£

¤³¤Î¤È¤­Instantiate ¤ÎºÂɸ¤ò¸¶ÅÀ¤Ë¤·¤Ê¤¤¤Ç²¼¤µ¤¤

¢¨SetActiveRecursively¡Ê¡Ë¤Ï¥â¥Ç¥ë¤ÏÈóɽ¼¨¤Ë¤Ê¤ê¤Þ¤¹¤¬»Ò¶¡¤Ë¤·¤¿¥Ñ¡¼¥Æ¥£¥¯¥ë¥¨¥Õ¥§¥¯¥È¤Ê¤É¤Ï¥·¡¼¥ó¤Ë»Ä¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¤Î¤Ç ¥«¥á¥é¤Ë±Ç¤é¤Ê¤¤¾ì½ê¤Ë¥ª¥Ö¥¸¥§¥¯¥È¤òÀ¸À®¤·¤Þ¤¹



¥â¥Ç¥ë¤ò»ÈÍѤ¹¤ë¤È¤­¤Ï¥ª¥Ö¥¸¥§¥¯¥È̾.SetActiveRecursively¡Êtrue¡Ë ¤Ç¥ª¥Ö¥¸¥§¥¯¥È¤òɽ¼¨¾õÂ֤ˤ·¤Þ¤¹



¡ü spawner¤Î¥¯¥é¥¹¤ÎÃæ¤ÇPrefab¤òºîÀ®¤¹¤ëÅÙ¤ËPrefab¤òÇÛÎó¤ËÅÐÏ¿¤¹¤ë


¢¨Static·¿ÇÛÎó¤ò»ÈÍѤ¹¤ì¤Ð¤É¤³¤«¤é¤Ç¤â¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤¹¡£

Prefab¤òºï½ü¤¹¤ë¤È¤­¤ÏÇÛÎ󤫤éÅÐÏ¿¤òËõ¾Ã¤·¤Þ¤¹¡£



¢£ ¥ª¥Ö¥¸¥§¥¯¥È¥×¡¼¥ë¤ÎÎã

¥ª¥Ö¥¸¥§¥¯¥È¥×¡¼¥ë¤Î¥¹¥¯¥ê¥×¥È¤ÏUnit£ùËÜÂΤ˥Хó¥É¥ë¤µ¤ì¤Æ¤¤¤ë¡ÉAngrybots¡É¤Î¥¹¥¯¥ê¥×¥È

¡ÉSpawner.js¡É
¤ò»²¾È¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£

http://www.booncotter.com/unity-prefactory-a-better-pool-manager/

http://tasogare66.blog.fc2.com/blog-entry-16.html
C#¤Ë¥ê¥é¥¤¥È¤µ¤ì¤¿¥Ð¡¼¥¸¥ç¥ó¤¬¤³¤Á¤é¤Ë·ÇºÜ¤µ¤ì¤Æ¤¤¤Þ¤·¤¿¡¡



¡üSpawner.js



#pragma strict

static var spawner : Spawner;

var caches : ObjectCache[];

var activeCachedObjects : Hashtable;


class ObjectCache {
var prefab : GameObject;
var cacheSize : int = 10;

private var objects : GameObject[];
private var cacheIndex : int = 0;

function Initialize () {
objects = new GameObject[cacheSize];

// Instantiate¤·¤¿¥ª¥Ö¥¸¥§¥¯¥È¤òÇÛÎó¤Ë³ÊǼ¤·¤Æ
for (var i = 0; i < cacheSize; i++) {
objects[i] = MonoBehaviour.Instantiate (prefab) as GameObject;
objects[i].SetActiveRecursively (false); // ¥ª¥Ö¥¸¥§¥¯¥È¤òÈóɽ¼¨¾õÂ֤ˤ¹¤ë
objects[i].name = objects[i].name + i;
}
}

function GetNextObjectInCache () : GameObject {
var obj : GameObject = null;


obj = objects[cacheIndex];

// Èó¥¢¥¯¥Æ¥£¥Ö¾õÂÖ ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ß¤Ä¤«¤ì¤Ð¤½¤ì¤ò»ÈÍÑ
if (!obj.active)
break;

// ¥¤¥ó¥Ç¥Ã¥¯¥¹¤¬¥­¥ã¥Ã¥·¥å¥µ¥¤¥º¤òͤ¨¤Ê¤¤¤è¤¦¤ËºÆ·×»»
cacheIndex = (cacheIndex + 1) % cacheSize;

}

// ¥¢¥¯¥Æ¥£¥Ö¾õÂ֤Υª¥Ö¥¸¥§¥¯¥È¤¬¸«¤Ä¤«¤ì¤Ðºï½ü¤¹¤ë
if (obj.active) {
Debug.LogWarning (
"Spawn of " + prefab.name +
" exceeds cache size of " + cacheSize +
"! Reusing already active object.", obj);
Spawner.Destroy (obj);
}


// ¥¤¥ó¥Ç¥Ã¥¯¥¹¤¬¥­¥ã¥Ã¥·¥å¥µ¥¤¥º¤òͤ¨¤Ê¤¤¤è¤¦¤ËºÆ·×»»
cacheIndex = (cacheIndex + 1) % cacheSize;
return obj;
}
}

function Awake () {

spawner = this;

//¥­¥ã¥Ã¥·¥å¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¿ô¤ÎÊÑ¿ôÀßÄê
var amount : int = 0;

// ¥­¥ã¥Ã¥·¥å¸¡º÷¤Î¥ë¡¼¥×
for (var i = 0; i < caches.length; i++) {
// Initialize each cache
caches[i].Initialize ();

// Count
amount += caches[i].cacheSize;
}

// ¥ª¥Ö¥¸¥§¥¯¥È¸Ä¿ôʬ¤Î¥Ï¥Ã¥·¥å¥Æ¡¼¥Ö¥ëÇÛÎó¤ÎºîÀ®
activeCachedObjects = new Hashtable (amount);
}

static function Spawn (prefab : GameObject, position : Vector3, rotation : Quaternion) : GameObject {
var cache : ObjectCache = null;

// ¥­¥ã¥Ã¥·¥åÇÛÎó¤ò¸¡º÷¤·¤ÆÀ¸À®¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤¬ÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë¤«¸¡º÷
if (spawner) {
for (var i = 0; i < spawner.caches.length; i++) {
if (spawner.caches[i].prefab == prefab) {
cache = spawner.caches[i];
}
}
}

// ¥­¥ã¥Ã¥·¥å¤ò¸¡º÷¤·¤Æ¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¤éÉáÄ̤ËInstantiate() ¤Ç¥ª¥Ö¥¸¥§¥¯¥ÈÀ¸À®
if (cache == null) {
return Instantiate (prefab, position, rotation) as GameObject;
}
// ¥­¥ã¥Ã¥·¥åÇÛÎ󤫤鼡¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¼è¤ê¤À¤¹
var obj : GameObject = cache.GetNextObjectInCache ();

// ¥ª¥Ö¥¸¥§¥¯¥È¤ËPosition,Rotation ¤ò¥»¥Ã¥È
obj.transform.position = position;
obj.transform.rotation = rotation;
// ¥ª¥Ö¥¸¥§¥¯¥È¤òɽ¼¨
obj.SetActiveRecursively (true);
spawner.activeCachedObjects[obj] = true;

return obj;
}

static function Destroy (objectToDestroy : GameObject) {
if (spawner && spawner.activeCachedObjects.ContainsKey (objectToDestroy)) {
objectToDestroy.SetActiveRecursively (false);
spawner.activeCachedObjects[objectToDestroy] = false;
}
else {
objectToDestroy.Destroy (objectToDestroy);
}
}



¢£¥Ï¥Ã¥·¥å¥Æ¡¼¥Ö¥ëÇÛÎó¤Î³ÈÄ¥¤ÏtempÇÛÎó¤òºî¤Ã¤Æ°ìÅÙÇÛÎó¤òÂàÈò¤µ¤»¤¿¸å¤â¤È¤ÎÇÛÎó¥µ¥¤¥º¤ò³ÈÄ¥¤·¤Æ

CopyTo¥á¥½¥Ã¥É¤ò»ÈÍѤ·¤Æ¥Ç¡¼¥¿¤ò¤â¤È¤ÎÇÛÎó¤Ë¤â¤É¤·¤Æ¤¢¤²¤ì¤Ð¤è¤¤¤Ç¤¹¡£

Îã¡Ë

static function EnlargeArrays(count:int, icount:int)
{
tempVerts:Vector3[] = Vertices;
Vertices = new Vector3[Vertices.Length + count];
¡¡¡¡ tempVerts.CopyTo(Vertices, 0);

}



¢£¤½¤Î¾ ¶õ¤ÎGameObject¤òºîÀ®¤·¤Æspawn»þ¤ËPrefab¤ò¤½¤Î»Ò¶¡¤È¤·¤ÆÀ¸À®¤¹¤ëÊýË¡

no title


ÇÛÎó¤ò»È¤ï¤Ê¤¯¤Æ¤â¤³¤ó¤Ê¤«¤ó¤¸¤Ç¿Æ»Ò¤Ë¤¹¤ì¤Ð »Ò¶¡¤Îtransform¾ðÊ󤫤éÇÛÎó¤¬À¸À®¤Ç¤­¤Þ¤¹

²Ä»ë²½¤Ç¤­¤ë¤Î¤Ç¥Ç¥Ð¥Ã¥°¤Ï¤·¤ä¤¹¤¯¤Ê¤ê¤Þ¤¹¤Í








¢£¥ª¥Ö¥¸¥§¥¯¥ÈÇÛÎó¤Î¼èÆÀÊýË¡

Î㣱¡ãtransforrm¤òľÀÜÇÛÎó¤Ë³ÊǼ¤¹¤ë¾ì¹ç¡ä


for (var child : Transform in transform) {

¼Â¹Ôʸ


}



Î㣲¡ãGetComponentsInChildren¤ò»ÈÍѤ¹¤ë¾ì¹ç¡ä




var allChildren = gameObject.GetComponentsInChildren(Transform);

for (var child : Transform in allChildren) {

¼Â¹Ôʸ

}



¤Î¤è¤¦¤ËFind¥á¥½¥Ã¥É¤ò»È¤ï¤º¤ËGameObject¤ÎÇÛÎó¤ò¼èÆÀ¤¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹

¤¦¤Þ¤¯»ÈÍѤ¹¤ì¤Ð¥·¡¼¥óÁ´ÂΤò¥µ¡¼¥Á¤¹¤ëFind¥á¥½¥Ã¥É¤ËÈæ¤Ù¤Æ¹â®¤Êưºî¤¬´üÂÔ½ÐÍè¤Æ¾¯¤·¹¬¤»¡£





¢£¤Þ¤È¤á¡§

¡üSendMessage()¥á¥½¥Ã¥É¤Ï¤¢¤Þ¤ê®ÅÙ¤ò´üÂԤǤ­¤Ê¤¤¤Î¤Ç ½ÐÍè¤ë¸Â¤ê¥³¥ó¥Ý¡¼¥Í¥ó¥È¤òľÀܸƤӽФ¹¤Û¤¦¤¬

½èÍý®ÅÙŪ¤Ê¸þ¾å¤Ï´üÂÔ½ÐÍè¤Þ¤¹¡£


¡üFind¥á¥½¥Ã¥É¤¬Á´È̤Ë®ÅÙ¤¬¤¤¤Þ¤¤¤Á¤Ê¤Î¤Ç°ìÅÙFind¤·¤¿¥Ç¡¼¥¿¤ÏÇÛÎó¤Ë¤È¤Ã¤Æ¤ª¤¤¤Æ»È¤¤¤Þ¤ï¤¹¤³¤È¤Ç

½èÍý®ÅÙ¤¬²þÁ±¤Ç¤­¤Þ¤¹¡£


¡ü¥ª¥Ö¥¸¥§¥¯¥È¥×¡¼¥ë ÇÛÎó¤Ë¥­¥ã¥Ã¥·¥å¤¹¤ë¤³¤È¤Ç¥á¥â¥ê´ÉÍý¾å¤Ï ¥ª¥Ö¥¸¥§¥¯¥ÈÀ¸À®ºï½ü¤Ëµ¯°ø¤·¤¿¥Ò¡¼¥×°µ½Ì

¤Ë¤è¤ëÃٱ䤬²þÁ±¤µ¤ì¤ë¸ú²Ì¤¬¤¢¤ê¤Þ¤¹¡£¡Ê°ÊÁ°¤Î ¹â®²½¤Î£²¤Îµ­»ö¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡Ë


ñ½ã¤ËNofitication Center ¡Ê¡Ë¤òSendMessage¡Ê¡Ë¸Æ¤Ó½Ð¤·¤ò»ÈÍѤ·¤Ê¤¤½ñ¤­Êý¤Ë¤¹¤ì¤ÐÎɤ¤¤è¤¦¤Êµ¤¤â¤·¤¿¤ê¤Ê¤Î¤Ç¤¹¤¬¡£

StaticÊÑ¿ô¤ò´ÉÍý¤¹¤ë¥¹¥¯¥ê¥×¥È¤òºîÀ®¤·¤Æ¥Ç¡¼¥¿¤Î°ì³ç´ÉÍý¤Ç¤â¤¤¤¤¤è¤¦¤Êµ¤¤â¤·¤Þ¤¹ ¤½¤³¤é¤Ø¤ó¤Ï¥±¡¼¥¹¥Ð¥¤¥±¡¼¥¹¤Ç¡£¡£

¢¬¤³¤Î¥Ú¡¼¥¸¤Î¥È¥Ã¥×¥Ø