Unity2D~对周目解密小游戏练习(三天完成)

对周目解密小游戏练习

知识点回顾总结

效果

总结知识点

游戏模式:单模式Unity 场景,在Hierarchy 窗口的场景中还包含其他活动场景。
使用C#:单例、字典、范型、哈希、集合、数组、事件委托等相关知识点...
unity版本2020.3

在这里插入图片描述

但模式场景包含多个Scene
在这里插入图片描述
视频:https://www.zhihu.com/zvideo/1534472458514370560
在这里插入图片描述

事件脚本在最后

  1. 游戏管理者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(); 清楚游戏数据
    }

  1. 单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() 	对基类的重写
	{
		
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SYFStrive

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值