Files

263 lines
9.6 KiB
C#
Raw Permalink Normal View History

2024-08-23 15:49:34 +08:00
using GCGame.Table;
using System.Collections;
using System.Collections.Generic;
using Games.GlobeDefine;
using Module.Log;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Rendering;
namespace Games.LogicObj
{
public class Obj_FakeShow_Init_Data : Obj_Character_Init_Data
{
public string FakeModelPath = "";
public string BundlePath = "";
public Hashtable m_Hash;
public Obj_FakeShow_Init_Data()
{
CleanUp();
}
public override void CleanUp()
{
FakeModelPath = "";
BundlePath = "";
m_Hash = null;
}
}
public class Obj_FakeShow : Obj_Character
{
public UnityAction<GameObject> onModelUpdate;
public const int startShowId = 31;
public const int idleShowId = 0;
public List<int> starShowEffects = new List<int>();
public const float startShowInterval = 12f;
private int ChangeColorToken = -1;
private int ChangeColorToken1 = -1;
private float _nextAnimTime = float.NegativeInfinity;
private bool NewLoadStart = false;
public override bool Init(ObjParent_Init_Data initData1)
{
Obj_FakeShow_Init_Data initData = initData1 as Obj_FakeShow_Init_Data;
if (initData == null)
return false;
InitMaterialManager();
_nextAnimTime = float.NegativeInfinity;
ModelID = initData.m_ModelVisualID;
WeaponDataID = initData.m_WeaponDataID;
WeaponEffectGem = initData.m_WeaponEffectGem;
WingModelAuraid = initData.m_WingAuraId;
EffectAuraId = initData.m_EffectAuraId;
Profession = initData.m_nProfession;
AdvanceWingId = initData.m_AdvanceWingId;
if(ObjEffectLogic!=null)
{
for(int i=0;i< starShowEffects.Count;i++)
{
ObjEffectLogic.RemoveEffectByEffectId(starShowEffects[i]);
}
}
starShowEffects.Clear();
var charModel = TableManager.GetCharModelByID(ModelID, 0);
if (charModel != null)
{
isShowFirst = true;
NewLoadStart = true;
AppendEffectIds(starShowEffects, charModel.EffectID);
if (initData.BundlePath != "")
CreateModel(ModelID, initData.FakeModelPath, initData.BundlePath, initData.m_Hash);
else
CreateModel(ModelID, initData.FakeModelPath, initData.m_Hash);
}
else
{
LogModule.ErrorLog("CharModel is null : " + ModelID);
}
return true;
}
public static void AppendEffectIds(List<int> effectList, string effectString)
{
var segments = effectString.Split(':');
for (var i = 0; i < segments.Length; i++)
{
var effectStr = segments[i];
int effectId;
if (int.TryParse(effectStr, out effectId) && effectId > 0)
effectList.Add(effectId);
}
}
public void ChangeToBlack()
{
var nameId = Shader.PropertyToID("_Color");
ChangeColorToken = CreateVectorPropertyMod(nameId, Color.black, 1);
nameId = Shader.PropertyToID("_OutlineColor");
ChangeColorToken1 = CreateVectorPropertyMod(nameId, Color.black, 1);
}
public void RemoveBlack()
{
RemoveShaderMod(ChangeColorToken, 1);
RemoveShaderMod(ChangeColorToken1, 1);
}
public override void DestroyObj()
{
onModelUpdate = null;
base.DestroyObj();
}
private bool isShowFirst = false;
protected override void Update()
{
base.Update();
if (NewLoadStart)
return;
if (AnimLogic == null)
_nextAnimTime = -1f;
else if (AnimLogic.gameObject.activeSelf)
{
if (isShowFirst)
{
isShowFirst = false;
_nextAnimTime = Time.unscaledTime + startShowInterval;
AnimLogic.Play(startShowId); //模型展示的出场动作
for(int i=0;i< starShowEffects.Count;i++)
{
ObjEffectLogic.PlayEffect(starShowEffects[i]);
}
}
else if (_nextAnimTime > 0f)
{
if (_nextAnimTime < Time.unscaledTime)
{
_nextAnimTime = Time.unscaledTime + startShowInterval;
AnimLogic.Play(startShowId); //模型展示的出场动作
for (int i = 0; i < starShowEffects.Count; i++)
{
ObjEffectLogic.PlayEffect(starShowEffects[i]);
}
EffectAddPoint[] effects = gameObject.GetComponentsInChildren<EffectAddPoint>(true);
for(int i=0;i< effects.Length;i++)
{
if (effects[i].pointName.Contains("ModelEffectShow"))
effects[i].gameObject.SetActive(true);
}
}
}
}
}
public bool IsInAnimTransistion()
{
return AnimLogic != null && AnimLogic.IsInTransition();
}
private void PlayStartShow()
{
if (ModelNode.model != null)
{
ModelNode.model.transform.localScale = Vector3.one;
var meshRenderer = ModelNode.model.gameObject.EnsureComponent<MeshRenderer>();
meshRenderer.receiveShadows = false;
meshRenderer.shadowCastingMode = ShadowCastingMode.Off;
// 注这个仍然会走常规初始化到Idle的动画流程然后用这个StartShow覆盖Idle动画指令
if (AnimLogic != null && AnimLogic.gameObject.activeSelf)
{
_nextAnimTime = Time.unscaledTime + startShowInterval;
AnimLogic.PlayStartShow(idleShowId); //默认先播放IdleUI动作延迟检测没有就不播放(缓冲池取出来的同类型资源未重置状态机)
}
else
_nextAnimTime = float.NegativeInfinity;
}
}
protected override void CreateModelOver(Hashtable hashParam)
{
base.CreateModelOver(hashParam);
RealoadPlayerWeaponVisual();
ReloadPlayerEffect();
RealoadWingModel(-1, -1, -1, true);
SetModelView(hashParam);
if (AnimLogic != null)
AnimLogic.cullAnimator = false;
PlayStartShow();
NewLoadStart = false;
if (hashParam != null)
{
if (hashParam.ContainsKey("InitOverCallBack"))
{
var intinOverCallBack = (UICameraTexture.InitOverCallBack) hashParam["InitOverCallBack"];
if (intinOverCallBack != null)
intinOverCallBack();
}
if (hashParam.ContainsKey("InitModelPathCallBack"))
{
var initModelPathCallBack =
(UICameraTexture.InitModelPathCallBack) hashParam["InitModelPathCallBack"];
if (initModelPathCallBack != null)
initModelPathCallBack();
}
}
if (onModelUpdate != null)
onModelUpdate(ModelNode.model == null ? null : ModelNode.model.gameObject);
}
protected void RepeatPlayAnimation()
{
if (ModelNode.model != null)
{
var newRender = ModelNode.model.gameObject.EnsureComponent<MeshRenderer>();
newRender.shadowCastingMode = ShadowCastingMode.Off;
newRender.receiveShadows = false;
newRender.motionVectorGenerationMode = MotionVectorGenerationMode.ForceNoMotion;
AnimLogic.Play(31); //模型展示的出场动作
}
}
protected void SetModelView(Hashtable hashParam)
{
Transform mobjTransform = null;
Camera mCamera = null;
Vector3 Pos = Vector3.zero;
Vector3 Rot = Vector3.zero;
if (hashParam!=null)
{
if (hashParam.ContainsKey("_FakeObj"))
{
var fake = (UICameraTexture.FakeShowObj)hashParam["_FakeObj"];
if (fake != null)
{
if (fake.FakeObj != null)
mobjTransform = fake.FakeObj.transform;
if (fake.renderCamera != null)
mCamera = fake.renderCamera;
}
}
if (hashParam.ContainsKey("Pos"))
Pos = (Vector3)hashParam["Pos"];
if (hashParam.ContainsKey("Rot"))
Rot = (Vector3)hashParam["Rot"];
}
if (mobjTransform == null || mCamera == null)
return;
mobjTransform.localPosition = new Vector3(Pos.x, Pos.y, 5);
mobjTransform.localRotation = Quaternion.Euler(Rot);
if(!hashParam.ContainsKey("isSettedOrthSize"))
{
mCamera.orthographicSize = Pos.z;
}
}
}
}