Create with Code # Unit 3 – Sound and Effects

作者: zsh2517 分类: Unity 发布时间: 2020-02-29 21:39

官网链接 Create with Code

系列链接
Unit 1 – Player Control
Unit 2 – Basic Gameplay
Unit 3 – Sound and Effects
Unit 4 – Gameplay Mechanics
Unit 5 – User Interface

Unit 3 – Sound and Effects

任务

目的
1. 人物跳跃
2. 人物的无限奔跑
3. 无限背景的反向思维
4. 动画的使用
5. 音效的使用
6. 死亡停止生成
7. 粒子效果
内容
一个类似于跑酷的游戏,不过仅仅包含一种元素(栅栏)
包含了背景音效、粒子效果、游戏结束、动画等

要点

人物跳跃

AddForce()ForceMode.Impuse;

ForceMode 时间 质量 公式
ForceMode.Force Time.DeltaTime 1.0 ft=mv
ForceMode.Acceleration Time.DeltaTime m ft=1.0 * v
ForceMode.Impulse 1.0 m f * 1.0=m * v
ForceMode.VelocityChange 1.0 1.0 f * 1.0=1.0 * v

参考: Unity中关于作用力方式ForceMode的功能注解

人物的无限奔跑

只要是人物一直向右走,便有可能跃出平台等等。反过来想的话,人往右走,摄像机跟随人,和摄像机、人静止但是所有物体左移一样。所以通过所有物体(包括背景)左移即可。

无限背景的反向思维

官方实例的背景是包含两个一样内容的图片。所以只需要在背景走到一半的时候切到开头就可以做出来无限奔跑的效果。
其中涉及到的长度的获取。给背景添加一个 BoxCollider 即可,系统自动获取正好合适的碰撞箱大小。之后使用碰撞箱的大小即可。

public class RepeatBackground : MonoBehaviour
{
    private Vector3 startPos;
    private float repeatWidth;
    // Start is called before the first frame update
    void Start()
    {
        startPos = transform.position;
        repeatWidth = GetComponent<BoxCollider>().size.x / 2;
    }
    // Update is called once per frame
    void Update()
    {
        if (transform.position.x < startPos.x - repeatWidth)
        {
            transform.position = startPos;
        }
    }
}

动画的使用

参见博客 Unity动画系统的入门理解

音效的使用

Unity 中的音乐(音效)是 AudioClipAudioClip 就是导入到 Unity 的音频文件。
AudioClip, AudioSource, AudioListener 三者的话, AudioClip 就是素材, AudioSource 就是播放组件,而 AudioListener 是玩家的接收组件。

AudioListener 附加到 Camera 上,用来接收声音。
AudioSource 是音频组件,音效文件可以作为 AudioClip 附加到任何的 GameObjectAudioSource 组件上面。用来处理不同的音效。
AudioListener 类似于耳朵, AudioSource 类似于播放器, AudioClip 类似唱片。

游戏内,背景音乐附加到了 Main Camera ,勾选了 Play On Awake 进入游戏自动播放和 loop 循环
音效的话,采用了

public AudioClip jumpSound;
public AudioClip crashSound;
// ------------
playerAudio.PlayOneShot(jumpSound, 1.0f); // 后面参数 0~1 float 音量

死亡停止生成

公开变量 public bool gameOver = false; ,之后生成、跳跃等等均先判断 false 再继续。

粒子效果

  1. 死亡灰烬
  2. 运动烟尘
    二者都是子对象。采用相对坐标的。
    动画播放和停止
ParticleSystem ps;
ps.play(); // 播放
ps.stop(); // 停止

代码:

public ParticleSystem explosionParticle;
public ParticleSystem dirtParticle;
void Update()
{
    if (Input.GetKeyDown(KeyCode.Space) && isOnGround && !gameOver)
    {
        playerRb.AddForce(Vector3.up*jumpForce,ForceMode.Impulse);
        isOnGround = false;
        playerAnim.SetTrigger("Jump_trig"); // 动画——跳跃
        dirtParticle.Stop();
        playerAudio.PlayOneShot(jumpSound, 1.0f); // 跳跃声音
        // PlayerRigidBody.AddForce(Vector3.up*100);
    }
}
private void OnCollisionEnter(Collision other)
{
    if (other.gameObject.CompareTag("Ground"))
    {
        isOnGround = true;
        dirtParticle.Play(); // 如果和地面接触,那么播放跑步灰尘
    }
    else
    {
        if (other.gameObject.CompareTag("Obstacle")) // 撞到障碍物
        {
            gameOver = true;
            dirtParticle.Stop(); // 停止跑步灰尘显示
            Debug.Log("Game over!");
            playerAnim.SetBool("Death_b", true);
            playerAnim.SetInteger("DeathType_int", 1);
            explosionParticle.Play(); // 播放灰烬动画
            playerAudio.PlayOneShot(crashSound, 1.0f); // 播放撞击声 
        }
    }
}

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

标签云