unity-新手引导

关于 unity 项目的新手引导制作


比较老的新手引导的做法是上下左右四个遮罩组合,把需要 点击 的地方镂空出来。

这里的做法是顶层用一个遮罩全部遮挡住,遮罩上用个 Button 接收点击事件,然后后把事件传递给 目标控件

  • 效果图

    这里写图片描述

  • 预制件

    这里写图片描述

    这里写图片描述

  • 逻辑代码(都是lua),完整版

    --======================================================================
    -- descrip: 新手引导
    --======================================================================
    
    local CTool = require "logic.common.tool"
    local EventEnum = require "logic.base.event_enum"
    local CObjectBase = require "logic.object.base_object"
    
    local CGuideMgr = class(CObjectBase)
    CGuideMgr.__name = "CGuideMgr"
    
    function CGuideMgr.Init(self)
      CObjectBase.Init(self)
      self._path = "Assets/res/Prefabs/ui/PnlMask.prefab"
      self._rootTran = nil
      self._BtnMask = nil
      self._BtnTarget = nil
      self._Finger = nil -- 手指特效
      self._clickTarget = nil 
      self._isForceGuide = false -- 是否强制引导
      self._guideRect = nil
    
      self:InitEvent()
    end
    
    function CGuideMgr.InitMask(self)
      local guideCanvas = gGame:GetUIMgr():GetUIGuideCanvasObj()
      self._guideRect = guideCanvas.transform:GetComponent("RectTransform")
    
      self._rootTran = CTool.Instantiate(self._path, guideCanvas.transform).transform
      GameObject.DontDestroyOnLoad(self._rootTran.gameObject)
    
      self._BtnMask = self._rootTran:GetComponent("Button")
      self._BtnTarget = self._rootTran:Find("BtnTarget"):GetComponent("Button")
      self._Finger = self._rootTran:Find("e_ui_xingshou_01")
    
      UIEventListener.Get(self._BtnMask.gameObject).onClick = LuaHelper.VoidDelegate(function() self:HandlerBtnMask() end)
      UIEventListener.Get(self._BtnTarget.gameObject).onClick = LuaHelper.VoidDelegate(function() self:HandlerBtnTarget() end)
    end
    
    function CGuideMgr.InitEvent(self) 
      self:RegistEventListener(EventEnum.GuideShow, function(...) self:ShowMask(...) end)
    end
    
    function CGuideMgr.ShowMask(self, target, isForce)
      if not self._rootTran then
          self:InitMask()
      end
    
      self._isForceGuide = isForce or false
      self._clickTarget = target
      self._rootTran.gameObject:SetActive(true)
    
    -- 这里是将遮罩上 Button 根据传进来的对象的位置 摆放 好,这个Button 其实可以降 alpha 调为0,就可以直接看到 目标对象
      local uiCam = gGame:GetUIMgr():GetUICamera()
      local targetPos = target.transform.position
      local screenPos = Utils.WorldToScreenPoint(uiCam, targetPos)
      local v2 = Vector2.New(screenPos.x, screenPos.y)
      local localPos = Utils.ScreenPointToLocalPointInRectangle(self._guideRect, v2, uiCam)
    
      local dstPos = Vector3.New(localPos.x, localPos.y, 0)
      self._BtnTarget.transform.localPosition = dstPos
      self._Finger.transform.localPosition = dstPos
      -- print("--- localPos, x:{0}, y:{1}", localPos.x, localPos.y)
    
    -- 设置 Button 大小
      local targetRect = target.transform:GetComponent("RectTransform")
      print("--- targetRect, width:{0}, height:{1}", targetRect.rect.width, targetRect.rect.height)
    
      local mv = self._BtnMask:GetComponent("MaskValue") -- 这个其实修改遮罩中的 圆形镂空 缩放的效果,其实就是修改 shader 的值
      mv:SetValue(50, 100, Vector4.New(localPos.x, localPos.y, 0, 0))
    end
    
    function CGuideMgr.HideMask(self)
      self._clickTarget = nil
      if not self._rootTran then return end
    
      self._rootTran.gameObject:SetActive(false)
      self._BtnMask:GetComponent("MaskValue"):Pause()
    end
    
    
    function CGuideMgr.DestroyMask(self)
      self._clickTarget = nil
      if not self._rootTran then return end
    
      GameObject.Destroy(self._rootTran.gameObject)
      self._rootTran = nil
      self._BtnMask = nil
      self._BtnTarget = nil
      self._guideRect = nil
    end
    
    function CGuideMgr.HandlerBtnMask(self)
      if self._isForceGuide then return end
    
      self:HideMask()
    end
    
    function CGuideMgr.HandlerBtnTarget(self)
      Utils.ExecutePointerClick(self._clickTarget) 
      self._clickTarget = nil
      self:HideMask()
    end
    
    return CGuideMgr
    • Utils.ExecutePointerClick(self._clickTarget) 这个方法触发 go 对象上实现了 IPointerClickHandler 接口的方法
     public static void ExecutePointerClick(GameObject go) {
            ExecuteEvents.Execute<IPointerClickHandler>(go, new PointerEventData(EventSystem.current), ExecuteEvents.pointerClickHandler);
        }
  • 触发事件显示引导

    EventTrigger(EventEnum.GuideShow, self._view._Btn2.gameObject) -- _Btn2 这个就是需要被引导的 ui 按钮

Unity游戏新手引导框架是一个用于帮助游戏新手快速了解游戏操作和玩法的工具。它提供了简单易用的界面和功能,能够帮助开发者创建各种引导效果。 首先,Unity游戏新手引导框架可以通过在游戏界面上创建引导框、箭头、文字等元素来引导新手玩家操作。开发者可以根据游戏需要自定义这些引导元素的样式和位置,以及添加相应的动画效果,以提高引导的可视化效果和吸引力。 其次,引导框架还可以根据游戏进程自动触发引导步骤。开发者可以在不同的关卡、任务或场景中插入相应的引导步骤,当玩家达到特定条件时,引导框架会自动显示相应的引导信息和提示,帮助玩家顺利完成任务或解决问题。 另外,Unity游戏新手引导框架还支持多种交互方式。除了简单的点击操作外,它还可以响应滑动、按压、拖拽等手势操作,并根据不同的手势提供相应的引导指引。这样可以更好地适应不同类型的游戏和玩家操作习惯,提供更全面的引导体验。 最后,Unity游戏新手引导框架还提供了丰富的回调函数和事件触发功能,使开发者可以根据游戏需求在引导的每个步骤中执行特定的逻辑操作。比如,可以在引导结束后发放奖励,切换到下一个场景,或者执行其他一些自定义的游戏逻辑。 总的来说,Unity游戏新手引导框架为开发者提供了一种快速、方便、可定制的方式来创建和管理游戏新手引导,提升玩家的游戏体验和上手难度。无论是对于小型独立开发者还是大型游戏企业,这个框架都是一个非常有价值的工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蝶泳奈何桥.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值