知识点回顾总结
效果
总结知识点
游戏模式:单模式Unity 场景,在Hierarchy 窗口的场景中还包含其他活动场景。
使用C#:单例、字典、范型、哈希、集合、数组、事件委托等相关知识点...
unity版本2020.3
在这里插入图片描述
但模式场景包含多个Scene
视频:https://www.zhihu.com/zvideo/1534472458514370560
- 游戏管理者GameManager
GameManager脚本💾|👷鼠标
//字典小仓库 判断游戏是否完成
private Dictionary<string, bool> MiniGameDic = new Dictionary<string, bool>();
//保存第几周游戏
private int gameWeek;
//传递数据更新数据
private GameController gameController;
void Start()
{
SceneManager.LoadScene("Home", LoadSceneMode.Additive); //启动游戏异步加载首页
🐖开始初始化可以切换场景
EventHandler.CallIsDialogus(DialogusState.Playe); //初始可以切换场景
}
private void OnEnable()
{
🐖新场景加载后执行事件订阅
EventHandler.AfterSceneLoadedEvent += OnAfterSceneLoadedEvent;
🐖游戏结束判断是否完成游订阅
EventHandler.MiniGameNmaeStart += OnMiniGameNmaeStart;
🐖初始游戏更新清楚数据订阅
EventHandler.StartNewGameEvent += OnStartNewGameEvent;
}
private void OnDisable()
{
EventHandler.AfterSceneLoadedEvent -= OnAfterSceneLoadedEvent;
EventHandler.MiniGameNmaeStart -= OnMiniGameNmaeStart;
EventHandler.StartNewGameEvent -= OnStartNewGameEvent;
}
事件执行函数:
private void OnAfterSceneLoadedEvent()
{
foreach (var item in FindObjectsOfType<MiniGame>())
{
if (MiniGameDic.TryGetValue(item.gameName,out bool isPass))
{
item.isPass = isPass;
item.UpdateMiniGameStart();
}
}
更新数据
gameController = FindObjectOfType<GameController>();
gameController?.NewStartGame(gameWeek);
}
private void OnMiniGameNmaeStart(string obj)
{
MiniGameDic[obj] = true;
}
private void OnStartNewGameEvent(int gameWeek)
{
this.gameWeek = gameWeek;
MiniGameDic.Clear(); 清楚游戏数据
}
- 单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(InteractiveWithUI()) return;//如果在于UI交互那么直接return;防止UI挡住了切换场景的碰撞体还可以切换场景
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) //如点击了钥匙就把的itemName传过去反之。。。
interaction.CheckItemName(currentName);
else
interaction.EmptyClick();
break;
}
}
// 检测鼠标点击的碰撞体
private Collider2D CursorMovePos()
{
return Physics2D.OverlapPoint(cursorPos);//Collider2D 与该点重叠的碰撞体。
}
//判断是不是与UI交互
private bool InteractiveWithUI()
{
if (EventSystem.current != null && EventSystem.current.IsPointerOverGameObject())
{
return true;
}
return false;
}
SlotUI ->>
public RectTransform rectTransform; 要显示或移除的UI(如点击道具出现一只小手)
private bool isHold; 保存布尔值判断是否点击和使用道具
private ItemName currentName; 保存点击道具的ItemName;
Update(){
if (rectTransform.gameObject.activeInHierarchy) 如何显示UI则他的位置跟着鼠标的位置
rectTransform.position = Input.mousePosition;
}
private void OnEnable()
{
🐖显示或隐藏UI订阅
EventHandler.ItemSelectEvent += OnItemSelectEvent;
🐖使用了道具隐藏UI如:手指
EventHandler.ItemUseUI += OnItemUseUI;
}
private void OnDisable()
{
EventHandler.ItemSelectEvent -= OnItemSelectEvent;
EventHandler.ItemUseUI -= OnItemUseUI;
}
事件执行函数:
private void OnItemSelectEvent(ReturnItemData returnItemData, bool isSelect)
{
isHold = isSelect;
if (isSelect)
{
保存returnItemData的itemName值
currentName = returnItemData.itemName;
}
rectTransform.gameObject.SetActive(isHold); UI的显示或隐藏
}
private void OnItemUseUI(ItemName itemName)
{
isHold = false; 道具使用了就变成false
rectTransform.gameObject.SetActive(false); 隐藏背包的道具、等等还需要清楚背包集合的数据
itemName = ItemName.无; 将值设为空
}
↓↓↓如果点击的标签是Interactive 、Interactive是一个基类(因为以后扩展有含对对话的内容)
case "Interactive":可点击对象,如老奶奶对话等。。。
var interaction = clickObject.GetComponent<Interactive>();
if (isHold) //如点击了钥匙就把的itemName传过去反之。。。
interaction.CheckItemName(currentName);
else
interaction.EmptyClick();
break;
↑↑↑Interactive脚本💾
public ItemName requireItam; 可视化选着该解密的条件(如需要船票就选船票)
public bool isDane;
public void CheckItemName(ItemName itemName)
{
if (requireItam == itemName && !isDane) //如果接受到的itemName于自身的不相等说明需要其他的解密道具
{
isDane = true;
//使用该道具和移除道具
OnClickAction();
🐖使用了道具隐藏UI如:手指->CursorManager:EventHandler.CallItemUseUI(itemName);
}
}
protected virtual void OnClickAction() 基类方法
{
}
public virtual void EmptyClick() 基类方法
{
Debug.Log("空的");
}
↑↑↑场景2的老奶奶对话继承Interactive基类脚本💾
public class CharacterH2 : Interactive
{
private ContorllerDialogus contorllerDialogus;对话的UI展示脚本
private void Awake()
{
//拿到对话脚本ContorllerDialogus
contorllerDialogus = GetComponent<ContorllerDialogus>();
}
protected override void OnClickAction() 对基类的重写
{