ÔÚ¡¶´«Ææ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. ÐÔÄÜÓÅ»¯£ºÊ¹ÓöÔÏ󳨼õÉÙ×ÊÔ´¿ªÏú¡£
Ò»¡¢¶¯Ì¬ÒôЧ¼ÓÔØ»úÖÆ½âÎö
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. ÐÔÄÜÓÅ»¯£ºÊ¹ÓöÔÏ󳨼õÉÙ×ÊÔ´¿ªÏú¡£

