- 项目概述
项目概述:本作品是一款基于Unity游戏引擎技术的小游戏。该游戏主要设计了三个关卡,玩家通过鼠标点击控制人物移动,可以攻击在场景中的怪物。击败一定数量的怪物会进行升级。
主要职责:在游戏中主要实现了课程中涉及的控制角色运动和攻击,碰撞检测,血量控制,音效控制,三维场景设计,AI角色运动和攻击等功能。
项目成果:该游戏是本次课程的阶段成果检验,也帮助玩家适当的放松,缓解精神疲劳。
- 项目的设计:
1.项目应用的素材
(1)项目插件:
Uniersal RP 通用渲染管线插件;
Shader Graph 图形程序编辑插件;
ProBuilder 场景搭建插件;
Polybrush 地形编辑插件;
Cinemachine 摄像机插件;
(1)项目素材:
FREE Skybox Extended Shader 天空盒素材;
DogKnight 小狗骑士;
RPG Monster Duo PBR Polyart 怪物角色;
SimpleNaturePack 场景素材;
Scene Teleportation Kit 传送门模型素材;
SineVFX;水晶和石头素材;
2.游戏策划
游戏规则:点击开始按钮载入游戏场景开始游戏,玩家通过鼠标点击控制人物移动,可以攻击在场景中的怪物。击败一定数量的怪物会进行升级。靠近传送门后可以按下E键进行同场景或不同场景的传送。
游戏功能设计:
图1.游戏功能的设计
- 项目的实现
- 接口实现观察者模式的订阅和广播,当玩家死亡,发送广播,敌人收到广播切换胜利动画。
当玩家死亡时会调用游戏管理实例里的广播函数GameManager.instance.Notify();敌人收到广播后,完成胜利动画的切换。
public void Notify()
{
foreach(var item in observers)
{
item.EndNotify();
}
}
public void EndNotify()
{
iswalk = false;
ischase = false;
an.SetBool("Win", true);
attacktarget = null;
playerdead = true;
}
- 制作了一个工具类Singleton,用于实现单例模式,在使用时让gamemanage或其他需要使用单例模式的类继承此工具类,类似如下。
public class Mouse_manage : Singleton<Mouse_manage>
public class Singleton<T> : MonoBehaviour where T:Singleton<T>
{
public static T instance;//单例模式泛型
protected virtual void Awake(){
if(instance!=null){
Destroy(gameObject);
}else{
instance=(T)this;
}
}
public static T Instance
{
get
{
return instance;
}
}
}
- 传送门的实现
先制作传送门的预制体,拥有两个部分,父节点理解为要去目的地,它的子节点为当地门所在位置的名字。用enum定义目的地类型。
public enum DestinationTag{Enter,A,B,C}//传送目的地
启动协程,判断是同场景还是不同场景后,配合淡入淡出效果,异步加载到新场景后重新实例化玩家并且加载保存好的玩家数据。
IEnumerator Transition(string ScenceName,transPointDestination.DestinationTag destinationTag){
SaveManager.instance.PlayerSaveData();
SceneFade fade = Instantiate(fadePrefab);
if(SceneManager.GetActiveScene().name!=ScenceName)//不同场景
{
Debug.Log("进入不同场景");
yield return StartCoroutine(fade.FadeOut(1.5f));
yield return SceneManager.LoadSceneAsync(ScenceName);
yield return player = Instantiate(playerPrefab,GetDestination(destinationTag).transform.position,GetDestination(destinationTag).transform.rotation);
StartCoroutine(fade.FadeIn(1.5f));
SaveManager.instance.PlayerLoadData();
yield break;
}else{
Debug.Log("进入相同场景");
player = GameManage.instance.playerCharacterState.gameObject;
player.GetComponent<NavMeshAgent>().enabled=false;
yield return StartCoroutine(fade.FadeOut(1.5f));
player.transform.SetPositionAndRotation(GetDestination(destinationTag).transform.position,GetDestination(destinationTag).transform.rotation);
player.GetComponent<NavMeshAgent>().enabled=true;
StartCoroutine(fade.FadeIn(1.5f));
yield break;
}
}
- 项目的效果图:(演示视频就可以,这里可以选择性填写)
- 自学的内容
在资源商店下载了一些素材。
六,创新点
无
七、项目总结
学到了角色参数的管理方式。游戏设计中常用的设计模式,场景的跳转方法,动画k帧操作。摄像机的体积光。Npc的行为动作机。
期间有一次Bug怎么也找不到错,原来是忘记挂给物体了。
接下来将会去学习多结局叙事类游戏的设计方式,类似《群星》或《文明》系列的模拟经营类游戏。