PGRData/Script/matrix/xui/xuihitmouse/mole/XUiMole.lua

205 lines
No EOL
5.6 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--=============
--Ui地鼠对象控件
--=============
local XUiMole = XClass(nil, "XUiMole")
--有限状态机字典
--Key: 状态枚举值 XHitMouseConfigs.MoleStatus
--Value: 状态机
local FSM_DIC = {}
local CsGameObject = CS.UnityEngine.GameObject
function XUiMole:Ctor(prefab, index, onHitCb)
self.Index = index
self.MolePrefabs = {}
self.OnHitCb = onHitCb
XTool.InitUiObjectByUi(self, prefab)
self:Init()
if self.MoleHole then
XUiHelper.RegisterClickEvent(self, self.MoleHole, function() self:OnClick() end)
end
end
function XUiMole:Init()
self:SetDefault()
end
function XUiMole:Clear(finishCb)
if self.Status == XHitMouseConfigs.MoleStatus.Default or
self.Status == XHitMouseConfigs.MoleStatus.Disappear then
if finishCb then
finishCb()
end
return
end
if self.Mole and self.Mole.GameObject.activeInHierarchy then
self:ChangeStatus(XHitMouseConfigs.MoleStatus.Disappear)
self.OnDisappearFinishCb = finishCb
else
if finishCb then
finishCb()
end
end
end
--===============
--设置地鼠
--@param moleId:
--===============
function XUiMole:SetMole(moleId)
if self.CurrentPrefab then self.CurrentPrefab.gameObject:SetActiveEx(false) end
if moleId and moleId > 0 then
local moleCfg = XHitMouseConfigs.GetCfgByIdKey(
XHitMouseConfigs.TableKey.Mole,
moleId
)
self.Type = moleCfg.Type
self.isNeedHit = moleCfg.Type == 1
self.Effect = moleCfg.Effect
self.ShowTimeAffix = moleCfg.ShowTimeAffix
self.CanBeHit = moleCfg.CanBeHit
self.Name = moleCfg.Name
self:LoadMolePrefab(moleCfg.Prefab)
end
self.ContainId = moleId
end
function XUiMole:SetDefault()
self.ContainId = -1
self:ChangeStatus(XHitMouseConfigs.MoleStatus.Default)
end
function XUiMole:StartStatus()
if not self.FSM then return end
self.FSM.OnStart(self)
end
function XUiMole:UpdateStatus()
if not self.FSM then return end
self.FSM.OnUpdate(self)
end
function XUiMole:ExitStatus()
if not self.FSM then return end
self.FSM.OnExit(self)
end
function XUiMole:ChangeStatus(status)
if self.Status == status then return end
self:ExitStatus()
self:SetStatus(status)
self:StartStatus()
end
function XUiMole:SetStatus(status)
self.Status = status or XHitMouseConfigs.MoleStatus.Default
if FSM_DIC[self.Status] then
self.FSM = FSM_DIC[self.Status]
return
end
local statusName = XHitMouseConfigs.MoleStatusName[self.Status]
if not statusName then
statusName = "Default"
end
local fsmName = "XUiMole" .. statusName .. "Status"
local fsm = require("XUi/XUiHitMouse/MoleStatus/" .. fsmName)
FSM_DIC[self.Status] = fsm
self.FSM = FSM_DIC[self.Status]
end
--=============
--检查是否被击中到消失次数
--=============
function XUiMole:CheckHitCount()
if self.ContainId <= 0 then
return false
end
if not self.CanBeHit then
local moleCfg = XHitMouseConfigs.GetCfgByIdKey(
XHitMouseConfigs.TableKey.Mole,
self.ContainId
)
self.CanBeHit = moleCfg.CanBeHit
end
return self.FeverHit or self.HitCount >= self.CanBeHit
end
function XUiMole:CheckShowTime(maxShowTime)
if self.ContainId <= 0 then
return
end
if self.ShowStartFlag == true then
self.ShowTimeCount = CS.UnityEngine.Time.deltaTime + self.ShowTimeCount
if self.ShowTimeCount >= (self.ShowTimeAffix * maxShowTime) then
self.ShowStartFlag = false
self.ShowTimeEnd = true
end
end
end
function XUiMole:Appear(finishCb)
if self.Mole and self.Mole.Appear then
self.AnimGaiziEnable:Stop()
self.AnimGaiziDisable:Stop()
self.AnimGaiziDisable:Play()
if not string.IsNilOrEmpty(self.Effect) then
self[self.Effect].gameObject:SetActiveEx(true)
end
self.Mole:Appear(finishCb)
end
end
function XUiMole:Hit(finishCb)
if self.Mole and self.Mole.Hit then
self.Mole:Hit(finishCb)
end
end
function XUiMole:Disappear(finishCb)
if self.Mole and self.Mole.Disappear then
self.AnimGaiziDisable:Stop()
self.AnimGaiziEnable:Stop()
self.AnimGaiziEnable:Play()
if not string.IsNilOrEmpty(self.Effect) then
self[self.Effect].gameObject:SetActiveEx(false)
end
self.Mole:Disappear(finishCb)
end
end
function XUiMole:Wait()
if self.Mole and self.Mole.Wait then
self.Mole:Wait()
end
end
function XUiMole:Dead()
self.IsDied = true
end
function XUiMole:OnClick()
if self.Status == XHitMouseConfigs.MoleStatus.Wait or
self.Status == XHitMouseConfigs.MoleStatus.Hit then
--XLog.Debug("Debug击中坑位" .. self.Index .. "号" .. "的" .. self.Name)
self.HitCount = self.HitCount + 1
self.BeHit = true
if self.OnHitCb then
self.OnHitCb()
end
end
end
function XUiMole:LoadMolePrefab(prefabPath)
if not self.MolePrefabs[prefabPath] then
local newRole = XUiHelper.Instantiate(self.Role.gameObject, self.Transform)
local prefab = newRole:LoadPrefab(prefabPath)
self.MolePrefabs[prefabPath] = prefab
self.CurrentPrefab = self.MolePrefabs[prefabPath]
else
self.CurrentPrefab = self.MolePrefabs[prefabPath]
end
if not self.Mole then
local XRole = require("XUi/XUiHitMouse/Mole/XUiHitMouseRole")
self.Mole = XRole.New(self.Role)
end
self.Mole:RefreshPrefab(self.CurrentPrefab)
self.CurrentPrefab.gameObject:SetActiveEx(false)
end
return XUiMole