µ±Ç°Î»Öà : 145zÓÎÏ·Õ¾¡¡|¡¡ÈÈѪ´«Ææ¡¡|¡¡¼¼Êõ½Ì³Ì¡¡|¡¡

´«ÆæBlueÒýÇæ¹ÖÎïÎÞÉùÖÕ¼«½â¾ö·½°¸£º¶¯Ì¬ÒôЧ¼ÓÔØ»úÖÆÓë½Å±¾°ó¶¨È«¹¥ÂÔ

Èȶȣº
ÔÚ¡¶´«ÆæBlueÒýÇæ¡·ÖУ¬¼´Ê¹ÕýÈ·ÅäÖÃÁ˹ÖÎïÒôЧ×ֶΣ¬ÈÔ¿ÉÄܳöÏÖÎÞÉùÎÊÌâ¡£ÕâÍùÍùÓëÒýÇæµÄ¶¯Ì¬ÒôЧ¼ÓÔØ»úÖÆ¡¢½Å±¾Ê¼þ°ó¶¨»òµ×²ãÒôƵģ¿éÉèÖÃÓйء£±¾ÎĽ«´Ó ¶¯Ì¬×ÊÔ´¼ÓÔØÁ÷³Ì ºÍ ½Å±¾Ê¼þÇý¶¯ Á½¸öά¶È£¬ÆÊÎöÎÞÉùÎÊÌâµÄÉî²ãÔ­Òò£¬²¢Ìṩ½ø½×½â¾ö·½°¸¡£

Ò»¡¢¶¯Ì¬ÒôЧ¼ÓÔØ»úÖÆ½âÎö

1.1 ÒýÇæ×ÊÔ´Ô¤¼ÓÔØ¹æÔò

Blue ÒýÇæµÄÒôЧϵͳ²ÉÓà “°´Ðè¼ÓÔØ” »úÖÆ£º
• ´¥·¢Ìõ¼þ£º¹ÖÎïÒôЧÐèÔÚ AI ½Å±¾ÖÐÏÔʽµ÷Óà PlaySound() º¯Êý£¬»òͨ¹ýÅäÖÃÎļþ¹ØÁªµ½Ìض¨ÐÐΪ£¨Èç¹¥»÷¡¢ÊÜ»÷£©¡£

• Ô¤¼ÓÔØÊ§°Ü±íÏÖ£º¼´Ê¹ÅäÖÃÎļþ·¾¶ÕýÈ·£¬ÈôÒôЧδ±»ÒýÇæÌáǰ¼ÓÔØ£¬Ê״δ¥·¢Ê±¿ÉÄÜÎÞÉù£¨ºóÐø¿ÉÄÜ»º´æ»Ö¸´£©¡£

½â¾ö·½·¨£º
ÔÚ mon35_ai.txt µÄ³õʼ»¯½×¶ÎÇ¿ÖÆÔ¤¼ÓÔØÒôЧ£º
function OnInit()
PreloadSound("monster35_attack.wav") -- Ç¿ÖÆ¼ÓÔØÒôЧ
PreloadSound("monster35_hurt.wav")
end


1.2 ¶àÓïÑÔÒôЧ¸²¸ÇÎÊÌâ

ÈôÒýÇæÆôÓÃÁË ¶àÓïÑÔÒôƵ°ü£¨ÈçÖÐӢ˫ÓïÒôЧ£©£¬ÐèÔÚÅäÖÃÎļþÖÐÖ¸¶¨ÓïÑÔ±êʶ£º
SoundAttack=monster35_attack_eng.wav ; Ó¢ÎÄÒôЧ
SoundAttack_zh=monster35_attack_chi.wav ; ÖÐÎÄÒôЧ

• ´íÎóÏÖÏó£ºÎ´Ö¸¶¨ÓïÑÔºó׺µÄÒôЧÎļþ¿ÉÄܱ»´íÎ󸲸ǻòºöÂÔ¡£

¶þ¡¢½Å±¾Ê¼þ°ó¶¨Éî¶ÈÓÅ»¯

2.1 AI ÐÐΪÊ÷ÓëÒôЧ´¥·¢µã

Blue ÒýÇæµÄ¹ÖÎï AI »ùÓÚÐÐΪÊ÷£¨Behavior Tree£©£¬ÒôЧÐè°ó¶¨µ½¾ßÌåÐÐΪ½Úµã£º
-- ʾÀý£º¹¥»÷ÐÐΪ½Úµã
BTNode_Attack = {
OnEnter = function()
PlaySound("monster35_attack.wav") -- ¹¥»÷¶¯×÷¿ªÊ¼Ê±²¥·Å
StartAnimation("attack") -- ²¥·Å¹¥»÷¶¯»­
end,
Update = function()
-- ³ÖÐø¹¥»÷Âß¼­...
end
}

• ³£¼û´íÎ󣺽«ÒôЧ°ó¶¨µ½ OnExit£¨ÐÐΪ½áÊø£©¶ø·Ç OnEnter£¨ÐÐΪ´¥·¢£©£¬µ¼ÖÂÒôЧÑÓ³Ù»òȱʧ¡£

2.2 ʼþ¼àÌýÓëÒì²½¼ÓÔØ

¶ÔÓÚÐèÒªÒì²½¼ÓÔØµÄÒôЧ£¨È糬´óÎļþ£©£¬Ðè×¢²á»Øµ÷º¯ÊýÈ·±£¼ÓÔØÍê³É£º
function OnMonsterSpawn()
LoadSoundAsync("monster35_special.wav", function(success)
if success then
AttachSoundToEvent("SpecialAttack", "monster35_special.wav")
end
end)
end


Èý¡¢ÒýÇæµ×²ãÒôƵģ¿éÅäÖÃ

3.1 ÒôƵͨµÀ³åÍ»ÅŲé

Blue ÒýÇæÄ¬ÈÏʹÓà 8 ͨµÀ»ìÒô£¬ÈôÆäËûÄ£¿é£¨Èç¼¼ÄÜÒôЧ£©Õ¼Óùý¶àͨµÀ£¬¿ÉÄܵ¼Ö¹ÖÎïÒôЧ±»¾²Òô¡£
• Õï¶Ï·½·¨£ºÔÚÒýÇæÅäÖÃÎļþ EngineAudio.ini ÖÐÔö¼ÓͨµÀÊý£º
[Audio]
MaxChannels=16 ; ´Ó 8 ¸ÄΪ 16

• ×ÊÔ´¼à¿Ø£ºÍ¨¹ý AudioChannelMonitor ¹¤¾ßʵʱ²é¿´Í¨µÀÕ¼ÓÃÇé¿ö¡£

3.2 ÒôƵÉ豸¼æÈÝÐÔÎÊÌâ

• DirectX Óë OpenGL ģʽ²îÒ죺²¿·Ö¾É°æÒýÇæÔÚ OpenGL ģʽÏ¿ÉÄÜÌø¹ýÒôЧ³õʼ»¯¡£

• ½â¾ö·½°¸£ºÔÚÆô¶¯²ÎÊýÖÐÇ¿ÖÆÖ¸¶¨ÒôƵģʽ£º
BlueEngine.exe -audio DirectX


ËÄ¡¢ÊµÕ½°¸Àý£ºÎÞÉù¹ÖÎïÈ«Á÷³ÌÐÞ¸´

°¸Àý±³¾°

Ìí¼Ó mon35 ºó¹¥»÷ÒôЧȱʧ£¬µ«ÊÜ»÷ÒôЧÕý³£¡£

Öð²½ÅŲé

1. ÈÕÖ¾·ÖÎö£º·¢ÏÖ SoundLoadError: monster35_attack.wav (ChannelFull)¡£
2. ͨµÀÀ©ÈÝ£ºÐÞ¸Ä MaxChannels=16 ºóÎÊÌâ½â¾ö¡£
3. ÑéÖ¤£ºÍ¨¹ý AudioChannelMonitor ¹Û²ì¹¥»÷ÒôЧռÓÃͨµÀ 12£¬ÎÞ³åÍ»¡£

Îå¡¢½ø½×¼¼ÇÉÓë±Ü¿ÓÖ¸ÄÏ

5.1 ¶¯Ì¬ÒôЧ³Ø¼¼Êõ

¶Ô¸ßƵ´¥·¢ÒôЧ£¨Èç½Å²½Éù£©£¬Ê¹ÓöÔÏ󳨹ÜÀíÒôЧʵÀý£¬±ÜÃâÖØ¸´¼ÓÔØ£º
SoundPool = {
AttackSound = CreateSoundPool("monster35_attack.wav", 3) -- Ô¤Éú³É 3 ¸öʵÀý
}

function OnAttack()
local sound = SoundPool.AttackSound:GetInstance()
sound:Play()
end


5.2 °æ±¾¼æÈÝÐÔ¼ì²é

• ÒýÇæ°æ±¾²îÒ죺Blue 3.0+ µÄÒôƵ API ÓÉ PlaySound() ¸ÄΪ Play3DSound()£¬ÐèÊÊÅ䣺
-- Blue 3.0+ ¼æÈÝд·¨
if EngineVersion >= 3.0 then
Play3DSound("monster35_attack.wav", GetMonsterPosition())
else
PlaySound("monster35_attack.wav")
end


×ܽá

1. ¶¯Ì¬¼ÓÔØ£ºÍ¨¹ýÔ¤¼ÓÔØºÍÒì²½»Øµ÷È·±£ÒôЧ¾ÍÐ÷¡£
2. ½Å±¾°ó¶¨£º½«ÒôЧ¾«×¼¹ØÁªµ½ÐÐΪÊ÷½Úµã¡£
3. µ×²ãÅäÖ㺵÷ÕûÒôƵͨµÀÊýºÍäÖȾģʽ¡£
4. ÐÔÄÜÓÅ»¯£ºÊ¹ÓöÔÏ󳨼õÉÙ×ÊÔ´¿ªÏú¡£