当前位置:网站首页>Unity2D~对周目解密小游戏练习(三天完成)
Unity2D~对周目解密小游戏练习(三天完成)
2022-07-21 10:07:00 【MaNongSa】
知识点回顾总结
总结知识点
游戏模式:单模式Unity 场景,在Hierarchy 窗口的场景中还包含其他活动场景。
使用C#:单例、字典、范型、哈希、集合、数组、事件委托等相关知识点...
但模式场景包含多个Scene
UI
- 单Unity场景实现多场跳转
CursorManager脚本|鼠标
private Vector3 cursorPos => Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0));获取鼠标的点击点
private bool onclick; 判断是否点击
private void Update()
{
onclick = CursorMovePos();判断是否碰撞体碰撞
if (onclick && Input.GetMouseButtonDown(0))
{
ClickAction(CursorMovePos().gameObject);拿到碰撞到的gameObject
}
}
判断鼠标点击到了谁然后做相关的操作
private void ClickAction(GameObject clickObject)
{
switch (clickObject.tag)
{
case "Teleport": 场景
var teleport = clickObject.GetComponent<Teleport>();
teleport?.TeleportToScene();
break;
case "Item":钥匙等解密道具
var item = clickObject.GetComponent<Item>();
item?.ItemClick();
break;
case "Interactive":可点击对象,如老奶奶对话等。。。
var interaction = clickObject.GetComponent<Interactive>();
if (isHold) //如解密有条件需要拿到对应的条件,拿到就是就执行对应的方法反之。。。
interaction.CheckItemName(currentName);
else
interaction.EmptyClick();
break;
}
}
// 检测鼠标点击的碰撞体
private Collider2D CursorMovePos()
{
return Physics2D.OverlapPoint(cursorPos);//Collider2D 与该点重叠的碰撞体。
}
Teleport脚本
https://img-blog.csdnimg.cn/99c5143da4a940769e8e6f6bd89bec98.png
[SceneName]public string sceneFrom; 舔加Scene名称
[SceneName]public string sceneGoTo; 舔加Scene名称
//跳转到新的场景
public void TeleportToScene()
{
TransitionManager.Instance.Transition(sceneFrom, sceneGoTo);
}
Transition脚本|位置移动、场景跳转等
public void Transition(string from,string goTo)
{
StartCoroutine(TransitionToScene(from, goTo));启动协程
}
private IEnumerator TransitionToScene(string from, string goTo)
{
if (from != string.Empty)
{
卸载旧的场景
yield return SceneManager.UnloadSceneAsync(from);
}
在后台异步加载新的场景、类型为单模式Unity 场景
yield return SceneManager.LoadSceneAsync(goTo, LoadSceneMode.Additive);
//获得新的场景
Scene scene = SceneManager.GetSceneAt(SceneManager.sceneCount - 1);
将场景设为激活对象
SceneManager.SetActiveScene(scene);
}
- 实现点击物品舔加到背包,如钥匙,船票。。。
- 判断用过的物品应该删除等等逻辑。。。
Enums枚举脚本
public enum ItemName//解密用到的道具
{
空, 钥匙, 票
}
public enum DialogusState//于老奶奶对话用到的枚举变量
{
Pause,Playe
}
public enum BallName//小游戏对应小球的枚举变量
{
None,b1,b2,b3,b4,b5,b6
}
Item解密道具脚本脚本
public ItemName itemName;引入枚举
public void ItemClick()
{
//实现点击道具隐藏和舔加数据
InventoryManager.Instance.AddItem(itemName) ;
this.gameObject.SetActive(false);
}
InventoryManager小仓库脚本|背包相关逻辑
public ItemDataListConfig itemDataListConfig; 通过CreateAssetMenu创建自定义资源(.asset)
自定义资源脚本的插件start
public class ItemDataListConfig : ScriptableObject
{
public List<ReturnItemData> returnItemDatas;
public ReturnItemData GetIteamData(ItemName itemName)
{
return returnItemDatas.Find(i => i.itemName==itemName);//返回和itemName对应的ReturnItemData
}
}
[System.Serializable] 序列化可视数据面板
public class ReturnItemData{
解密对应的道具和图片
public ItemName itemName;
public Sprite itemSprite;
}
创建自定义资源脚本end
创建集合小背包保存捡到道具的名称
(可视化如:列表等)[SerializeField] public List<ItemName> itemNames = new List<ItemName>();
public void AddItem(ItemName itemName)
{
if (!itemNames.Contains(itemName)) 如果捡到的名字有了就不舔加因为这个这个游戏只有单一的解密道具
{
itemNames.Add(itemName);
创建事件委托、把道具舔加进背包
注册事件:EventHandler.CallUpdateEvent(itemDataListConfig.GetIteamData(itemName), itemNames.Count - 1);
}
}
创建InventoryUI小背包显示数据脚本
https://img-blog.csdnimg.cn/105cf81dfbd244c1bbdab7a88ed510c8.png
public SlotUI slotUI;//道具展示的UI
public Button leftButton;//左按钮切换
public Button rightButton;//有按钮切换
private int currenIndex; //显示UI的索引、可以判断背包里面有几个道具以判断左右按钮是否可以点击;
点击道具时注册的事件这里要订阅事件
private void OnEnable() 开始时舔加事件
{
EventHandler.UpdateUIEvent += OnUpdateUIEvent;
}
private void OnDisable() 结束时停止事件
{
EventHandler.UpdateUIEvent -= OnUpdateUIEvent;
}
事件执行函数:
private void OnUpdateUIEvent(ReturnItemData returnItemData, int index)
{
if (returnItemData == null) 没有点击过道具
{
currenIndex = -1;
leftButton.interactable = false;
rightButton.interactable = false;
slotUI是判断背包点击的逻辑脚本//
slotUI.SetEmpey();
}
else
{
currenIndex = index;
slotUI.SetItem(returnItemData);
if (index > 0)
leftButton.interactable = true;
else if (index < 0)
{
leftButton.interactable = false;
rightButton.interactable = false;
}
}
}
4.创建事件委托的脚本
using System;
//简便的事件中心 把所有的数据通过订阅的方式传递到个个代码中
public class EventHandler
{
//订阅
public static event Action<ReturnItemData, int> UpdateUIEvent;
//呼叫
public static void CallUpdateEvent(ReturnItemData returnItemData,int index)
{
UpdateUIEvent?.Invoke(returnItemData, index);
}
}
提示:以下是本篇文章正文内容
重点标记性文字设置
具体的标记性正文
具体的标记性正文
具体的标记性正文
具体的标记性正文
具体的标记性正文
具体的标记性正文
边栏推荐
- 阿里云技术专家杨泽强:弹性计算云上可观测能力构建
- 通过ATL库CRegKey读注册表(简单方便)
- Educational Codeforces Round 70 A题 You Are Given Two Binary Strings...
- 文字检测篇-传统篇
- Force buckle 1260 2D mesh migration
- 云原生时代,开发者应具备这5大能力
- 2019牛客暑期多校训练营(第六场)D-Move 【暴力枚举】
- Is redis single threaded or multi-threaded
- 2019牛客暑期多校训练营(第七场)A-String 【字符串最小表示法+暴力枚举】
- Grafana visual configuration chart table
猜你喜欢
图像矫正 + 文本矫正 技术深入探讨
力扣 1260. 二维网格迁移
有一说一,要搞明白优惠券架构是如何演化的,只需10张图!
Basic principle and configuration of switch
Ali Er Mian: what is MMAP? (not MMP)
It takes only 10 pictures to figure out how the coupon architecture evolved!
云原生时代,开发者应具备这5大能力
小米12S Ultra产品力这么强老外却买不到 雷军:先专心做好中国市场
Construction practice of pipeline engine of engineering efficiency ci/cd
I, AI doctoral student, online crowdfunding research topic
随机推荐
Educational Codeforces Round 70 A题 You Are Given Two Binary Strings...
驱动开发之双机调试环境搭建(VS2017)
6. < tag dynamic planning and housebreaking collection (tree DP) > lt.198 Home raiding + lt.213 Looting II + lt.337 Looting III DBC
quartz簡單用法及其es-job
Flink应用案例统计实现TopN的两种方式
from scratch implement crnn using pytorch :读取训练数据
MySQL performance optimization (II): select the optimized data type
Raspberry pie 3B builds Flink cluster
手把手教您上传NCBI 数据,免费课程包您学会!
MySQL进阶
Leetcode 104. Maximum depth of binary tree
辛丑年之立冬
阿里云技术专家杨泽强:弹性计算云上可观测能力构建
Perfect + today's headline written test questions + summary of knowledge points
2019杭电多校 第七场 6651-Final Exam【规律+思维】
shared_ PTR shared smart pointer
小米12S Ultra产品力这么强老外却买不到 雷军:先专心做好中国市场
mysql.h: No such file or directory
[H3C device networking configuration]
Codeforces Round #578 (Div. 2) C - Round Corridor 【数论+规律】