您的位置:首页 > 新闻 > 热点要闻 > 微信小程序公众平台官网_芜湖企业网站建设_培训学校加盟费用_营销网站建设教学

微信小程序公众平台官网_芜湖企业网站建设_培训学校加盟费用_营销网站建设教学

2025/1/4 14:05:44 来源:https://blog.csdn.net/suzh1qian/article/details/144157783  浏览:    关键词:微信小程序公众平台官网_芜湖企业网站建设_培训学校加盟费用_营销网站建设教学
微信小程序公众平台官网_芜湖企业网站建设_培训学校加盟费用_营销网站建设教学

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili

教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/

本章节给骷髅战士加上了音频,并且限制了产生音效的范围

可爱的骷髅战士

AudioManager.cs

      关键字段

  • AudioManager instance
    实现单例模式,确保全局只有一个 AudioManager 实例。

  • [SerializeField] private AudioSource[] sfx
    存储音效的 AudioSource 数组,每个元素对应一个音效。

  • [SerializeField] private AudioSource[] bgm
    存储背景音乐的 AudioSource 数组,每个元素对应一首背景音乐。

  • public bool playBgm
    控制背景音乐是否播放的开关。

  • private int bgmIndex
    当前播放的背景音乐索引。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class AudioManager : MonoBehaviour
{public static AudioManager instance;[SerializeField] private float sfxMinimumDistance;//音效最小距离[SerializeField] private AudioSource[] sfx;//音效[SerializeField] private AudioSource[] bgm;//背景音乐public bool playBgm;private int bgmIndex;private void Awake(){if(instance != null)Destroy(instance.gameObject);elseinstance = this;}private void Update(){if (!playBgm)StopAllBGM();else{if(!bgm[bgmIndex].isPlaying)//如果背景音乐没有播放PlayBGM(bgmIndex);}}public void PlaySFX(int _sfxIndex,Transform _source)//播放音效{if(sfx[_sfxIndex].isPlaying)//如果音效正在播放return;if(_source!=null && Vector2.Distance(PlayerManager.instance.player.transform.position, _source.position) > sfxMinimumDistance)//距离过远不播放return;if (_sfxIndex < sfx.Length){sfx[_sfxIndex].pitch = Random.Range(.85f, 1.15f);//设置音效的音调sfx[_sfxIndex].Play();}}public void StopSFX(int _index) => sfx[_index].Stop();//停止音效public void PlayRandomBGM()//播放随机背景音乐{bgmIndex = Random.Range(0, bgm.Length);PlayBGM(bgmIndex);}public void PlayBGM(int _bgmIndex)//播放背景音乐{bgmIndex = _bgmIndex;StopAllBGM();bgm[bgmIndex].Play();}public void StopAllBGM(){for (int i = 0; i < bgm.Length; i++){bgm[i].Stop();}}}

PlayerAnimationTriggers.cs

攻击触发的音效

AudioManager.instance.PlaySFX(2,null);//播放音效
using UnityEngine;public class PlayerAnimationTriggers : MonoBehaviour
{private Player player => GetComponentInParent<Player>();private void AnimationTrigger(){player.AnimationTrigger();}private void AttackTrigger()//攻击触发函数{AudioManager.instance.PlaySFX(2,null);//播放音效Collider2D[] colliders = Physics2D.OverlapCircleAll(player.attackCheck.position, player.attackCheckRadius);//检测区域内的敌人foreach (var hit in colliders)//遍历检测到的对象{if (hit.GetComponent<Enemy>() != null){EnemyStats _target = hit.GetComponent<EnemyStats>();//判断是否是敌人if (_target != null) //对敌人造成伤害player.stats.DoDamage(_target);ItemData_Equipment weaponData = Inventory.instance.GetEquipment(EquipmentType.Weapon);if (weaponData != null)//应用武器特殊效果weaponData.Effect(_target.transform);}}}private void ThrowSword(){SkillManager.instance.sword.CreateSword();}
}

SkeletonIdleState.cs

怪物的音效

AudioManager.instance.PlaySFX(24,enemy.transform);
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class SkeletonIdleState : SkeletonGroundedState
{public SkeletonIdleState(Enemy _enemyBase, EnemyStateMachine _stateMachine, string _animBoolName, Enemy_Skelteon _enemy) : base(_enemyBase, _stateMachine, _animBoolName, _enemy){}public override void Enter(){base.Enter();stateTimer = enemy.idleTime;}public override void Exit(){base.Exit();AudioManager.instance.PlaySFX(24,enemy.transform);}public override void Update(){base.Update();if (stateTimer < 0){stateMachine.ChangeState(enemy.moveState);}}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com