2025-06-04 05:02:57 +08:00

390 lines
9.1 KiB
Plaintext

autoImport("UIModelCell");
autoImport("SceneEmojiCell")
UIMultiModel = class("UIMultiModel", UIModelCell)
-- 多模型展示相機預設參數
UIMultiModel.CameraConfig=
{
Pvp={
position = Vector3(-1.8, 1.6, 5.47),
rotation = Quaternion.Euler(8, 160, -0.8000183),
fieldOfView = 60,
ClipPlanes={0.3,10},
},
Pet={
position = Vector3(-2.86, 6.11, 6.46),
rotation = Quaternion.Euler(8, 160, -0.763366),
fieldOfView = 67,
ClipPlanes={0.3,13.68},
}
}
--refactory
local cellData = {};
local tempVector3 = LuaVector3.zero
local InnerSingleModel = class("InnerSingleModel")
function InnerSingleModel:ctor()
end
function InnerSingleModel:CancelDelay()
self.delayCall = nil
self.delayCallArg = nil
self.delayTimeFlag = nil
end
function InnerSingleModel:SetIndex( index ,follow)
self.index = index
self.follow = follow
end
function InnerSingleModel:Redress(parts)
if(parts)then
self.model:Redress(parts)
end
end
function InnerSingleModel:SetParent(obj,flag)
if(self.model)then
self.model:SetParent(obj.transform,flag)
self.model:SetLayer(obj.layer)
end
end
function InnerSingleModel:DoConstruct(data)
self.model = Asset_Role.Create(data[1]);
end
function InnerSingleModel:DoDeconstruct()
self:CancelDelay()
self.model:Destroy()
self.model=nil
self:_DestroyEmoji()
end
function InnerSingleModel:_DestroyEmoji()
if(self.emoji) then
self.emoji:Destroy()
self.emoji = nil
if(self.follow) then
Game.RoleFollowManager:UnregisterFollow(self.follow.transform)
end
end
end
--delay seconds
function InnerSingleModel:DelayCall(delay,delayCall,delayCallArg)
self:CancelDelay()
self.delayCall = delayCall
self.delayCallArg = delayCallArg
self.delayTimeFlag = Time.unscaledTime + delay
end
function InnerSingleModel:Update()
if(self.delayTimeFlag) then
if(Time.unscaledTime>=self.delayTimeFlag) then
if(self.delayCall~=nil) then
self.delayCall(self.delayCallArg)
end
self:CancelDelay()
end
end
end
local oneVec = Vector3.one*3
local tempOffset = LuaGeometry.Const_V3_zero
function InnerSingleModel:PlayEmoji(emoji,rotation)
self:_DestroyEmoji()
if(self.follow) then
tempVector3:Set(0,0,0)
Game.RoleFollowManager:RegisterFollow(
self.follow.transform,
self.model.complete,
tempVector3,
tempOffset,
RoleDefines_EP.Top,
nil,
nil)
local path = ResourcePathHelper.Emoji(emoji)
TableUtility.ArrayClear(cellData)
cellData[1] = self.follow;
cellData[2] = path;
cellData[3] = 2;
cellData[4] = "animation";
cellData[5] = 1;
cellData[6] = InnerSingleModel._DestroyEmoji;
cellData[7] = self;
self.emoji = SceneEmojiCell.CreateAsArray(cellData)
self.emoji.gameObject.transform.localPosition = LuaGeometry.Const_V3_zero;
self.emoji.gameObject.transform.localRotation = rotation or LuaGeometry.Const_Qua_identity;
self.emoji.gameObject.transform.localScale=oneVec
return
end
end
function InnerSingleModel:PlayAction( actionName,loop )
if(not actionName or ""==actionName)then return end
if(loop) then
local params = Asset_Role.GetPlayActionParams(actionName)
params[5] = true
self.model:PlayAction(params)
else
self.model:PlayAction_Simple(actionName)
end
end
function InnerSingleModel:SetPosition(pos)
if(pos)then
self.model:SetPosition(pos)
end
end
function InnerSingleModel:SetRotation(rotation)
if(rotation)then
self.model:SetRotation(rotation)
end
end
function InnerSingleModel:SetScale(scale)
if(scale)then
self.model:SetScale(scale)
end
end
local cellData = {};
function UIMultiModel:ctor(go)
UIMultiModel.super.ctor(self,go)
self.modelmaps = {}
self.singleModelPool = {}
for i=1,GameConfig.Team.maxmember do
self.singleModelPool[#self.singleModelPool+1] = InnerSingleModel.new()
end
end
function UIMultiModel:GetSingleFromPool()
if(#self.singleModelPool>0) then
return table.remove(self.singleModelPool,1)
end
end
function UIMultiModel:AddSingleToPool(singleModel)
singleModel:DoDeconstruct()
self.singleModelPool[#self.singleModelPool + 1] = singleModel
end
function UIMultiModel:Init()
self.camera = self:FindGO("Camera"):GetComponent(Camera);
self.container = self:FindGO("ModelContainer");
self.dynamicMeshRenderer = self:FindGO("dynamic_Bg"):GetComponent(MeshRenderer)
self.staticMeshRender=self:FindGO("static_Bg"):GetComponent(MeshRenderer)
self.emoji_Root=self:FindGO("Emoji_Root")
self.follows = {}
for i=1,3 do
local follow = self:FindGO("Follow_"..tostring(i))
follow.transform:SetParent(self.emoji_Root.transform, false);
follow.layer = self.container.layer;
self.follows[#self.follows+1]=follow
end
end
function UIMultiModel:ChangeMeshRendererMat(name,uiTexture)
self:Show(self.dynamicMeshRenderer)
self:Hide(self.staticMeshRender)
self.gameObject:SetActive(true)
self.container:SetActive(true)
self.super.SetTexture(self,uiTexture);
if(self.dynamicMeshRenderer)then
local materials1 = self.dynamicMeshRenderer.materials
if(#materials1>0)then
self.material = materials1[1]
if(self.material)then
PictureManager.Instance:SetPetRenderTexture(name,self.material)
end
end
end
end
function UIMultiModel:SetMeshRendererColor(color)
if self.dynamicMeshRenderer then
local materials = self.dynamicMeshRenderer.materials
if #materials > 0 then
self.material = materials[1]
if self.material then
self.material:SetColor("_TintColor", color)
end
end
end
end
function UIMultiModel:SetRenderTexPath(index)
self.renderTexRId="GUI/pic/Model/UIModelTexture1"
end
function UIMultiModel:ShowTexture()
self.super.SetTexture(self,uiTexture);
self.gameObject:SetActive(true);
self.container:SetActive(true);
end
function UIMultiModel:Reset()
self.super.Reset(self);
self.container:SetActive(false);
end
function UIMultiModel:ResetModel()
--refactory
self:RemoveModels()
--refactory
PictureManager.Instance:UnloadPetTexture("",self.material)
end
--refactory
function UIMultiModel:ChangeCameraConfig(params)
self:_SetCameraConfig(params)
if(self.camera)then
self.camera.nearClipPlane=params.ClipPlanes[1]
self.camera.farClipPlane=params.ClipPlanes[2]
end
end
function UIMultiModel:Update()
for k,v in pairs(self.modelmaps) do
v:Update()
end
end
function UIMultiModel:AllPlayEffectOn(effect,ep)
for k,v in pairs(self.modelmaps) do
if(v.model)then
v.model:PlayEffectOneShotOn(effect,ep)
end
end
end
function UIMultiModel:PlayAction(index,actionName,loop)
local smodel = self:_GetSingleModelByIndex(index)
if(smodel) then
smodel:PlayAction(actionName,loop)
end
end
function UIMultiModel:PlayEmoji(index,emoji,rotation)
local smodel = self:_GetSingleModelByIndex(index)
if(smodel) then
smodel:PlayEmoji(emoji,rotation)
end
end
function UIMultiModel:PlayRandomEmoji(index,emojiArray,rotation,durationRange)
local smodel = self:_GetSingleModelByIndex(index)
if(smodel) then
if(emojiArray and #emojiArray>1)then
local emoji = emojiArray[math.random(1,#emojiArray)]
emoji = Table_Expression[emoji] and Table_Expression[emoji].NameEn or "Emoji_heart"
smodel:PlayEmoji(emoji,rotation)
if(durationRange and #durationRange>1) then
local duration = math.random(durationRange[1],durationRange[2])
smodel:DelayCall(duration,function ()
self:PlayRandomEmoji(index,emojiArray,rotation,durationRange)
end)
end
end
end
end
function UIMultiModel:_GetSingleModelByIndex(index)
return self.modelmaps[index]
end
function UIMultiModel:RemoveModel(index)
local smodel = self:_GetSingleModelByIndex(index)
if(smodel) then
self.modelmaps[index] = nil
self:AddSingleToPool(smodel)
end
end
function UIMultiModel:AddModel(index,args)
local smodel = self:_GetSingleModelByIndex(index)
if(smodel==nil) then
smodel = self:_AddModel(index,args)
end
return smodel
end
function UIMultiModel:_AddModel(index,args)
local smodel = self:_GetSingleModelByIndex(index)
local model = self:GetSingleFromPool()
model:SetIndex(index,self.follows[index])
model:DoConstruct(args)
model:SetParent(self.container,false)
self.modelmaps[index] = model
return model
end
function UIMultiModel:Redress(index,parts)
local smodel = self:_GetSingleModelByIndex(index)
if(smodel)then
smodel:Redress(parts)
end
return smodel
end
local cameraTrans
function UIMultiModel:SetModels(index,args)
if(args[10])then
self:Show(self.dynamicMeshRenderer)
self:Hide(self.staticMeshRender)
cameraTrans=UIMultiModel.CameraConfig.Pet
else
self:Hide(self.dynamicMeshRenderer)
self:Show(self.staticMeshRender)
cameraTrans=UIMultiModel.CameraConfig.Pvp
end
self.super.SetTexture(self,args[2])
self.gameObject:SetActive(true)
self.container:SetActive(true)
local hasModel=self:_GetSingleModelByIndex(index)
if(not args[1])then
self:RemoveModel(index)
else
local model = {}
if(hasModel and args)then
model = self:Redress(index,args[1])
else
model = self:AddModel(index,args)
end
model:SetPosition(args[3])
model:SetRotation(args[4])
model:SetScale(args[5])
if(args[6])then
model:PlayAction(args[6].name,args[6].loop)
end
self:PlayRandomEmoji(index,args[7],args[8],args[9])
end
self:ChangeCameraConfig(cameraTrans)
return model
end
function UIMultiModel:RemoveModels()
for k,v in pairs(self.modelmaps) do
self.modelmaps[k] = nil
self:AddSingleToPool(v)
end
end
--refactory