Unity3D 初入音效系统 AudioSource 的 PlayOnShot() Play() PlayClipAtPoint()

一.参考资料:  https://blog.csdn.net/winner_2012/article/details/46558435  https://blog.csdn.net/winner_2012/article/details/46558435  https://blog.csdn.net/winner_2012/article/details/46558589二.介绍目...
摘要由CSDN通过智能技术生成

一.参考资料:

  https://blog.csdn.net/winner_2012/article/details/46558435

  https://blog.csdn.net/winner_2012/article/details/46558435

  https://blog.csdn.net/winner_2012/article/details/46558589

二.介绍目录

  Class    AudioSource

  1.基本常识

  2.常见使用方法介绍

    Public Methed

      (1)  Play()  //播放背景音乐(只能播放在同一实际内播放一种音乐)

      (2)  PlayOnShot()  //播放2D音效

    Static Methed

      (1) PlayClipAtPoint()  //播放3D音效

 

-----------------------------官方API 指路-------------------------------------

AudioSource

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
public void Move() { int stt = sun; scoreText.text = stt.ToString(); if (Input.GetKey(KeyCode.W)) { direction = 0; this.gameObject.GetComponent<SpriteRenderer>().sprite = prota[2]; this.gameObject.transform.Translate(Vector3.up * speed * Time.deltaTime); } else if (Input.GetKey(KeyCode.S)) { this.gameObject.GetComponent<SpriteRenderer>().sprite = prota[0]; direction = 2; this.gameObject.transform.Translate(Vector3.down * speed * Time.deltaTime); } else if (Input.GetKey(KeyCode.D)) { direction = 3; this.gameObject.GetComponent<SpriteRenderer>().sprite = prota[1]; this.gameObject.transform.Translate(Vector3.right * speed * Time.deltaTime); } else if (Input.GetKey(KeyCode.A)) { direction = 1; this.gameObject.GetComponent<SpriteRenderer>().sprite = prota[3]; this.gameObject.transform.Translate(Vector3.left * speed * Time.deltaTime); } // 播放脚步声 if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)) { if (!audioSource.isPlaying) { audioSource.clip = footstepSound; audioSource.loop = true; audioSource.Play(); } } else { audioSource.Stop(); } // 攻击 if (Input.GetMouseButtonDown(0)) { // 处理鼠标左键点击事件 GameObject ins = Instantiate(bulletPrefab); Vector2 clickPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); ins.GetComponent<Blogs>().clickPosition = clickPosition; if (direction == 0) { ins.transform.position = new Vector3(this.gameObject.transform.position.x, this.gameObject.transform.position.y + 0.15f); } else if (direction == 2) { ins.transform.position = new Vector3(this.gameObject.transform.position.x, this.gameObject.transform.position.y - 0.15f); } else if (direction == 3) { ins.transform.position = new Vector3(this.gameObject.transform.position.x + 0.15f, this.gameObject.transform.position.y); } else if (direction == 1) { ins.transform.position = new Vector3(this.gameObject.transform.position.x - 0.15f, this.gameObject.transform.position.y); } } }public void OnCollisionEnter2D(Collision2D collision) { if(collision.gameObject.tag == "GoldCoin") { Destroy(collision.gameObject); sun = sun + 1; if (!audioSource.isPlaying) { audioSource.clip = shique; audioSource.loop = true; audioSource.Play(); } } else { audioSource.Stop(); } //判断是否遭受攻击 if (collision.gameObject.tag == "zhi") { Destroy(collision.gameObject); hp = hp - 1; } // 检测碰撞物体的标签 if (collision.gameObject.tag == "zhi2") { // 忽略该碰撞 Physics2D.IgnoreCollision(collision.collider, GetComponent<Collider2D>()); } }优化代码
05-18
1. 将变量和函数命名规范化,遵循驼峰式命名法。 2. 将常量和不变的数值提取出来,定义为常量或静态变量。 3. 合理利用 Unity 引擎提供的功能,如使用 GetComponent 获取组件、使用 ScreenToWorldPoint 将屏幕坐标转换为世界坐标等。 4. 使用 switch 语句代替 if-else 语句,可以提高代码可读性和效率。 5. 在需要处理多个碰撞标签时,可以使用 switch-case 语句代替多个 if-else 语句。 修改后的代码如下: ```C# public class PlayerController : MonoBehaviour { private const float Speed = 5f; // 移动速度 private const int MaxHp = 5; // 最大生命值 private const float BulletOffset = 0.15f; // 子弹偏移量 [SerializeField] private AudioClip footstepSound; // 脚步声音效 [SerializeField] private AudioClip shique; // 收集金币音效 [SerializeField] private GameObject bulletPrefab; // 子弹预制体 [SerializeField] private Sprite[] prota; // 精灵数组 [SerializeField] private Text scoreText; // 分数文本 private AudioSource audioSource; // 音频源 private int hp = MaxHp; // 当前生命值 private int score; // 得分 private int direction; // 移动方向 private void Start() { audioSource = GetComponent<AudioSource>(); } private void Update() { Move(); Attack(); } private void Move() { scoreText.text = score.ToString(); Vector3 movement = Vector3.zero; if (Input.GetKey(KeyCode.W)) { direction = 0; GetComponent<SpriteRenderer>().sprite = prota[2]; movement = Vector3.up; } else if (Input.GetKey(KeyCode.S)) { direction = 2; GetComponent<SpriteRenderer>().sprite = prota[0]; movement = Vector3.down; } else if (Input.GetKey(KeyCode.D)) { direction = 3; GetComponent<SpriteRenderer>().sprite = prota[1]; movement = Vector3.right; } else if (Input.GetKey(KeyCode.A)) { direction = 1; GetComponent<SpriteRenderer>().sprite = prota[3]; movement = Vector3.left; } transform.Translate(movement * Speed * Time.deltaTime); PlayFootstepSound(Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)); } private void PlayFootstepSound(bool isMoving) { if (isMoving && !audioSource.isPlaying) { audioSource.clip = footstepSound; audioSource.loop = true; audioSource.Play(); } else if (!isMoving) { audioSource.Stop(); } } private void Attack() { if (Input.GetMouseButtonDown(0)) { GameObject bullet = Instantiate(bulletPrefab); Vector2 clickPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); bullet.GetComponent<Bullet>().SetDirection(direction); bullet.transform.position = transform.position + BulletOffset * (Vector3)clickPosition.normalized; } } private void OnTriggerEnter2D(Collider2D other) { switch (other.tag) { case "GoldCoin": CollectCoin(other.gameObject); break; case "zhi": TakeDamage(1); break; } } private void OnTriggerStay2D(Collider2D other) { if (other.tag == "zhi2") { Physics2D.IgnoreCollision(other, GetComponent<Collider2D>()); } } private void CollectCoin(GameObject coin) { Destroy(coin); score++; audioSource.PlayOneShot(shique); } private void TakeDamage(int amount) { hp -= amount; if (hp <= 0) { Die(); } } private void Die() { Destroy(gameObject); // TODO: 处理玩家死亡逻辑 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值