近期工作遇到的問題及解決方式收藏
第一篇部落格還是要有點乾貨的
工作半年,遇到問題不少,這裡歸總一下:
1.FairyGUI列表動效逐一播放問題
直接上程式碼
註冊列表渲染及點選事件
function DlgWelfare:BindEvent()
--選項列表
self.listChooseReward.itemRenderer = function(...) self:itemRenderer_listChooseReward(...) end
end
在上一級點選事件回撥時填充列表item
function DlgWelfare:onClickItem_listChooseType(context)
--設定動效播放的時候事先設定為不可觸碰(在虛擬列表中,動效播放過程拖動列表會導致index錯亂)
self.listChooseReward.touchable = false
--設定初始填數量為0,便於計算不同情況下list的items填充數量
self.renderItemCount = 0
self.listChooseReward.numItems = #self.mCurDetail
local numList = self.listChooseReward.numItems
--設定播放時間取預計時間和正常列表播放時間的最小值
self:_PlayAnimation(math.min(self.renderItemCount, numList))
end
在列表填充的時候,每一次填充都會呼叫裡面的方法
---@param obj CompWelfareItem
--“---”註釋是EmmyLua的特定用法
function DlgWelfare:itemRenderer_listChooseReward(index, obj)
--每次填充list中的item數量都+1
self.renderItemCount = self.renderItemCount + 1
local playing = (not self.listChooseReward.touchable)
--通過obj傳入資料,用obj指向的控制元件寫SetItem方法呼叫傳入的資料
obj:SetItem(self.mCurDetail[index + 1], playing)
end
呼叫的播放動效
---@param loop number @迴圈次數
function DlgWelfare:_PlayAnimation(loop)
--播放時列表設定為可見
self.listChooseReward.visible = true
--在播放前如果存在計時器,事先把計時器停止再開啟。
if self.timer then
self.timer:Stop()
end
--動效播放時間為0.15秒
local duration = 0.15
local index = 0
--設定播放計時器
self.timer = Timer.New(function()
---@type CompWelfareItem
local item = self.listChooseReward:GetChildAt(index)
item:Play()
index = index + 1
if index == loop then
--當所有的動效播放完成設定列表可點選,保證做其他操作不會受影響
self.listChooseReward.touchable = true
end
end, duration, loop)
self.timer:Start()
end
調DlgWelfare:itemRenderer_listChooseReward(table, bool)中obj:SetItem(self.mCurDetail[index + 1], playing)傳入的資料
function CompWelfareItem:SetItem(item, playing)
--lua的用法(true and 0 or 1 返回 0,false and 0 or 1 返回 1),此處是設定控制元件控制器“ctrlApprence”的某個狀態
self.ctrlApprence.selectedIndex = (playing and 0 or 1)
self.data = item
end
此處為_PlayAnimation方法中item:Play()
function CompWelfareItem:Play()
--播放list中item的動效
self:GetTransition("t0"):Play()
end
當然在最後關閉頁面時需要對某些不在存在的東西進行銷燬
2.關於AB模式FairyGUI渲染問題
在AB模式下圖片不被渲染
在普通模式下則被渲染
原因:商城元件下的控制元件背景圖依賴於‘_back_ground’包,商城對於這張圖不直接依賴,在assetbound模式下控制元件所屬的’_public’包不直接載入,三層巢狀導致ab時圖層載入出現mesh的none故障。
解決方法:1.(最優解)將控制元件的背景圖放在’_public’中,釋出即可。
2.新增程式碼
ExUIPackage.AddPackage(’_back_ground’)
主動釋出背景包,公共包提前載入,公共包的引用計數會+1, 這樣就不會在視窗銷燬的時候被釋放掉。這樣可能會導致額外佔用記憶體。
3.關於FairyGUI翻牌效果
Demo中的指令碼是C#寫的
using System;
using System.Collections.Generic;
using FairyGUI;
using DG.Tweening;
using UnityEngine;
public class Card : GButton
{
GObject _back;
GObject _front;
public override void ConstructFromXML(FairyGUI.Utils.XML xml)
{
base.ConstructFromXML(xml);
_back = GetChild("n0");
_front = GetChild("icon");
_front.visible = false;
}
public bool opened
{
get{
return _front.visible;
}
set{
if (DOTween.IsTweening(this))
DOTween.Kill(this);
_front.visible = value;
_back.visible = !value;
}
}
public void SetPerspective()
{
_front.displayObject.perspective = true;
_back.displayObject.perspective = true;
}
public void Turn()
{
if (DOTween.IsTweening(this))
return;
bool toOpen = !_front.visible;
DOTween.To(() => 0, x =>
{
if (toOpen)
{
_back.rotationY = x;
_front.rotationY = -180 + x;
if (x > 90)
{
_front.visible = true;
_back.visible = false;
}
}
else
{
_back.rotationY = -180 + x;
_front.rotationY = x;
if (x > 90)
{
_front.visible = false;
_back.visible = true;
}
}
}, 180, 0.8f).SetTarget(this).SetEase(Ease.OutQuad);
}
}
using UnityEngine;
using FairyGUI;
using DG.Tweening;
public class TurnCardMain : MonoBehaviour
{
GComponent _mainView;
Card _c0;
Card _c1;
void Awake()
{
Application.targetFrameRate = 60;
Stage.inst.onKeyDown.Add(OnKeyDown);
UIPackage.AddPackage("UI/TurnCard");
UIObjectFactory.SetPackageItemExtension("ui://TurnCard/CardComponent", typeof(Card));
}
void Start()
{
_mainView = this.GetComponent<UIPanel>().ui;
_c0 = (Card)_mainView.GetChild("c0");
_c1 = (Card)_mainView.GetChild("c1");
_c1.SetPerspective();
_c0.onClick.Add(__clickCard);
_c1.onClick.Add(__clickCard);
}
void __clickCard(EventContext context)
{
Card card = (Card)context.sender;
card.Turn();
}
void OnKeyDown(EventContext context)
{
if (context.inputEvent.keyCode == KeyCode.Escape)
{
Application.Quit();
}
}
}
此處為Lua改寫的一些方法
---@class CompCard:GButton@翻牌效果
--註冊控制元件
CompCard = fgui.extension_class(CompBase, 'general', '控制元件_翻牌效果')
function CompCard:SetItem(index)
self.data = index
end
--繼承CompBase過載ctor函式
function CompCard:ctor()
--設定反面
self._back = self:GetChild("n46");
--設定正面
self._front = self:GetChild("n47");
--翻牌前反面向上,正面不顯示
self._front.visible = false;
self._front.displayObject.perspective = true;
self._back.displayObject.perspective = true;
end
翻牌效果函式
function CompCard:Turn()
local toOpen = not self._front.visible
--執行dotween動畫播放,旋轉180°,並且設定反面為不可見,正面為可見
local tween = TweenUtils.TweenFloat(0, 180, 0.8, function(x)
if (toOpen) then
self._back.rotationY = x
self._front.rotationY = -180 + x
if (x > 90) then
self._front.visible = true
self._back.visible = false
end
else
self._back.rotationY = -180 + x
self._front.rotationY = x
if (x > 90) then
self._front.visible = false
self._back.visible = true
end
end
end)
TweenUtils.SetTarget(tween, self)
TweenUtils.SetEase(tween, Ease.OutQuad)
end
需要重新設定屬性
local get = tolua.initget(CompCard)
local set = tolua.initset(CompCard)
get.opened = function(self)
return self._front.visible
end
set.opened = function(self, value)
if (TweenUtils.IsTweening(self)) then
TweenUtils.Kill(self)
self._front.visible = value
self._back.visible = not value
end
end
獲取item再呼叫呼叫翻牌函式
function DlgDupSettlement:onClickItem_listCard(context)
local item = self.listCard:GetChildAt(index)
item:Turn(self.getItem)
end
相關文章
- nodejs 近期所遇到的問題及解決NodeJS
- Fabric 環境搭建遇到問題及解決
- 遇到問題的解決方法
- 原始碼安裝apache(附遇到的問題及解決)原始碼Apache
- 爬蟲常見問題及解決方式爬蟲
- MAC 安裝 VMAF 遇到的問題及解決方法記錄Mac
- VS2019配置Opencv遇到的部分問題及解決方案OpenCV
- 【面試】工作中遇到的難點及解決方案——人臉解鎖相機衝突問題面試
- 玩Deno遇到問題的解決方案
- 工作中碰到的Java問題整理及解決方案Java
- 工作中遇到的問題
- Jekyll 本地除錯部落格遇到的問題及解決辦法除錯
- 更新macOS Monterey後遇到的各種Bug問題及解決方法Mac
- 收藏問題是沒人解決嘛
- 工作遇到的問題小記(一)
- 解決macbook安裝burp suite遇到的問題MacUI
- Windows 10 下搭建 Homestead 環境 Vagrant up 所遇到的問題及解決Windows
- oracle 11.2.0.4 DataGuard Broker配置過程中可能遇到的問題及解決方法Oracle
- GO Modules的理解和遇到的問題解決方法Go
- 關於工作中遇到的問題
- Bigkey問題的解決思路與方式探索
- PyTorch圖文安裝教程(Win10),含遇到的問題及解決辦法PyTorchWin10
- 使用nodeAPI時遇到非同步問題的解決方法API非同步
- div拖動遇到iframe卡頓的問題解決
- 部署專案遇到的mysql問題以及解決方法MySql
- IPython的安裝及問題解決Python
- [超長文,謹入]一文解決面試、工作遇到的安全性問題面試
- 基於CodeMirror開發線上編輯器時遇到的問題及解決方案
- 關於 LF will be replaced by CRLF 問題的解決方式
- 【SpringMVC】解決跨域問題的兩種方式SpringMVC跨域
- Selenium爬蟲遇到超時TimeOut問題的解決方法爬蟲
- mysql登入遇到ERROR 1045問題解決方法MySqlError
- 工作疑難問題解決4例
- Kafka常見的問題及解決方案Kafka
- CAS導致的ABA問題及解決
- Xcode 10.1 新特性及解決的問題XCode
- Harbor搭建及配置 問題解決
- Git常見問題及解決Git