目录
一、角色死亡
无论对于任何游戏来说实现玩家的死亡都是一个很重要的事情,接下来我们尝试这一效果,首先角色死亡的条件可能有很多,比如被怪物攻击、陷阱、或者从高处掉落,我们首先来实现一下从高处掉落的机制。
有很多实现方法,这里我想用一个触发器来当作死线,当玩家触碰到这个死线就会立刻死亡,所以首先建立一个空项目,然后添加一个碰撞体,并改成触发器,然后调节好它的大小
然后我们到Player的脚本中去写代码怕【注意:我们这里可以使用之前收集品的碰撞函数,可以更好的复用】,这里面在玩家死亡后,我们需要重启游戏场景这需要新的函数,所以我们需要新的头文件
using UnityEngine.SceneManagement;
然后我们利用场景重启函数来实现玩家的复活,代码如下:
/* 角色下落死亡 */
if(collision.tag == "deadline")
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name); //重启当前场景
}
我们利用GetActiveScene函数来获取当前场景的名字,这样避免了我们因为直接使用场景的名字而需要在不同游戏场景中更改代码的问题。但是经过测试我们发现这种重置的速度是很快的,我们想要有个延迟的效果。
实现方式很简单在确认达成死亡条件后不再是立刻死亡,而是先执行Invoke函数延迟一段时间,然后执行ReStart函数。
Invoke("ReStart", 0.5f); //延迟后执行死亡函数
二、场景切换
接下来我们想要从一个游戏场景切换到另一个场景,我的想法是在我们之前触发下一关对话框的地方加一段代码载入下一个场景,这个代码在按下E的时候会执行,加载下一个场景(SceneManager.GetActiveScene().buildIndex可以获得当前场景的编号)
using System.Collections;
using System.Collections.Generic;
using UnityEngine.SceneManagement;
using UnityEngine;
public class EnterTwo : MonoBehaviour
{
void Update()
{
if(Input.GetKeyDown(KeyCode.E)) //当按下E的时候
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex+1); //加载下一个场景
}
}
}
这个场景编号我们在哪里设置或者排序呢?
我们打开文件 > 生成设置我们就可以看见了,同样可以在这里导入我们的其他游戏场景。(可以直接将建立好的场景拖进来)
我决定把代码加载到这个默认关闭的UI上,这样就避免了玩家游戏过程中误触E键导致直接加载下一关的BUG
三、2D光效
第二个游戏场景我做成了专门的山洞,所以我们需要给它添加一些光效让它更好看,首先把地图和背景的材质改为Default - Diffuse 这样我们的场景就已经变暗了
此时我们发现角色因为没有添加材质,所以还是亮的,我们需要改变材质,然后场景中的东西全部暗下来后,我们开始尝试添加光源(游戏是2D游戏但光源是3D的,所以可能出现添加的点光源没有光亮,需要调整Z轴,同样的在添加材质后我们可能看不见场景中的原来的物体,也需要调整Z轴)
这样我们就实现了光源,我们同样的原理可以给Player添加一个光源
这样就实现啦。
注意:这里可以使用方向光来照亮整个场景。
四、优化
我给所有的物品都添加了一个收集动画,动画的制作非常简单,添加后的逻辑和怪物死亡的逻辑是相同的,所以我们将Player中的代码删除,挪动到了每个收集物品上。(因为只有两个收集品我就分别实现了,没有用类一起实现)
收集品的脚本:这里的代码的意思是当玩家触发的时候播放收集动画,动画播放完后会调用事件执行Destory函数
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Cherry : MonoBehaviour
{
public Animator Anim;
public Collider2D Coll;
private void OnTriggerEnter2D(Collider2D collision) //碰撞器触发函数
{
if(collision.tag == "Player")
{
Anim.SetTrigger("getting");
}
}
public void Destory()
{
Destroy(gameObject);
}
}
人物控制的脚本:
private void OnTriggerEnter2D(Collider2D collision) //碰撞器触发函数
{
/* 物品收集 */
if(BodyColl.IsTouching(collision) && collision.tag == "cherry") //樱桃收集
{
collision.enabled = false;
CherryAudio.Play();
CherryCount++; //收集品数量加一
CherryNumber.text = CherryCount.ToString();
}
if (BodyColl.IsTouching(collision) && collision.tag == "gem") //宝石收集
{
collision.enabled = false;
GemAudio.Play();
GemCount++; //收集品数量加一
GemNumber.text = GemCount.ToString();
}
}
这里首先在确定相碰后,先关闭碰撞体,防止在动画播放期间反复触发。