Unity2D入门—Pixel Adventure 1
第七章 锯子陷阱和角色音效
前言
本章进行锯子陷阱的开发和动作音效的添加,并为游戏添加一个劲爆的BGM。
一、锯子陷阱
1、横锯
这里横锯陷阱和上一章的平台的做法差不多,不过因为需要用到旋转的脚本,我们就不为横锯添加动画,而是只用贴图去实现。如果有兴趣的友友可以去尝试一下,实现思路和平台一致。下面我们首先实现横锯 (Saw) 陷阱和路径点的创建,并将Saw的Tag设置为Trap。然后为Saw添加碰撞体
接着,为Saw添加旋转的脚本,移动的脚本直接用Platform的脚本就行了。这里主要讲一下,是绕Z轴旋转,这里可以想象一下绕X轴和Y轴旋转肯定会发生奇怪的现象,或者直接上手试试,反正我改成其他轴就发现比较鬼畜。这里还要提一嘴WayPointFollower这个代码,如果横锯的Y轴和Point的Y轴不在同一水平线上,就会发生横锯斜向移动,作者在测试的时候就发现横锯在移动的时候总是会向上和向下移动一小段距离。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SawRotate : MonoBehaviour
{
[SerializeField] private float speed = 2f;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
transform.Rotate(0, 0, 360 * speed * Time.deltaTime);
}
}
2、竖锯
竖锯的和横锯差不多,只不过是将横锯旋转90度之后的样子,除此之外还多了一根棍子罢了。因此,我们首先Ctrl+D复制一个Saw2, 接着,在Transform将Z轴的Rotate改成90度就行了。
接着,我们需要选择素材作为棍子,不过得先载创建一个Tilemap,命名为Tilemap1。太粗了,所以直接把X轴缩短。
下面,我们还需要使用Renderer的Order in Layer属性,这个属性可以使同一个Layer上的对象按照一定顺序排序,防止创建的Sorting Layer过多造成的不便。其实这是关于渲染顺序的问题这里可以参考 link。
二、音效添加
游戏的音效对游戏十分重要,一个好的游戏音效不仅可以增强游戏的打击感,还可以让玩家更深入地沉浸在游戏世界中。下面我们将说明如何为角色和背景添加音效。
1、下载资源
资源下载使从Unity Store,资源名为FREE Casual Game SFX Pack,然后选择在Unity中打开,下载并导入即可。然后将我们需要的音效例如,跳跃、收集、死亡,胜利等重命名,以便查看。
2、更改脚本
因为音效是随着动作出现的,所以我们需要更改Player的所以动作脚本,为其添加音效。例如,在PlayerMovement中,添加了 **[SerializeField] private AudioSource jumpSoundEffect;**和 jumpSoundEffect.Play(); 第一个是声明一个AudioSource表示对应的音效资源,第二个是播放音效。其他两个脚本的修改是类似的。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
private Rigidbody2D rb;
private BoxCollider2D coll;
private SpriteRenderer sprite;
private Animator anim;
//LayerMask: 这是Unity中的一个类型,用于表示多个层(Layers)的集合。
//在Unity中,你可以为场景中的对象分配不同的层,以便更好地管理和处理它们。
//LayerMask通常用于射线投射(Raycasting)或碰撞检测(Collision Detection)
[SerializeField] private LayerMask jumpableGround; //设置只能在地面上跳一次的功能
private float dirX = 0f;// 用于判断
//[SerializeField] 可以将moveSpeed和jumpForce直接显示在组件里,方便修改
//至于moveSpeed和jumpForce就是用来设置水平方向速度和竖直方向速度的
[SerializeField] private float moveSpeed = 7f;
[SerializeField] private float jumpForce = 7f;
private enum MovementState { idle, run, jump, fall }; //这是一个枚举类型的数组idle=0,run=1,jump=2, fall=3
[SerializeField] private AudioSource jumpSoundEffect;
// Start is called before the first frame update
void Start()
{
// 这一块就是获取组件,方便获取对应数据
rb = GetComponent<Rigidbody2D>();
coll = GetComponent<BoxCollider2D>();
sprite = GetComponent<SpriteRenderer>();
anim = GetComponent<Animator>();
}
// Update is called once per frame
void Update()
{
//这一部分和之前差不多,就是速度的部分替换moveSpeed和jumpSpeed
dirX = Input.GetAxisRaw("Horizontal");
rb.velocity = new Vector2(dirX * moveSpeed, rb.velocity.y);
// 加入IsGrounded()限制跳跃
if (Input.GetButtonDown("Jump") && IsGrounded())
{
jumpSoundEffect.Play();
rb.velocity = new Vector2(rb.velocity.x, jumpForce);
}
//用于获取最终状态值的函数
UpdateAnimationState();
}
private void UpdateAnimationState()
{
MovementState state;
if (dirX > 0f)
{
state = MovementState.run;
sprite.flipX = false; //翻转画布,防止变成太空步
}
else if (dirX < 0f)
{
state = MovementState.run;
sprite.flipX = true;
}
else
{
state = MovementState.idle;
}
if (rb.velocity.y > .1f)
{
state = MovementState.jump;
}
else if (rb.velocity.y < -.1f)
{
state = MovementState.fall;
}
//最后将最终的状态设置到anim组件的state值上
anim.SetInteger("state", (int)state);
}
private bool IsGrounded()
{
return Physics2D.BoxCast(coll.bounds.center, coll.bounds.size, 0f, Vector2.down, .1f, jumpableGround);
}
}
3、添加音效
由于添加音效的方法都是一样,所以这里我们以jump的音效添加为例。首先,需要添加一个Audio Source组件,因为我们脚本里用的就是[SerializeField] private AudioSource jumpSoundEffect。然后将jump音频拖到 Audio Clip 中,并叉掉 Play On Awake (这里是为了防止一开始就播放音效)。最后,再将Audio Source组件拖到脚本上。
4、BGM
除了动作音效,我们还需要添加背景音乐。首先,先建一个 Empty Object,命名为BGM , 然后去挑选一个喜欢的音乐拖到Project Window中。这里作者选了CS2的 触摸能量 和 非人类 的音效,很带劲好评!!!然后在BGM中添加Audio Source组件,并勾选Loop(循环播放)。不够,如果你的动作音效是一个卖点的话,背景音乐还是选择轻音乐比较好,不然很有可能听不到动作音效,又或者可以调节背景音乐的音量。
总结
这一章的新东西并没有那么多,主要还是一些概念的理解,例如,渲染顺序。接着,我们学会了如何为动作添加音效以及BGM。大概就是这么多,后面大概再写1-2章这一项目就做完了,开心!!