Files
2024-08-23 15:49:34 +08:00

263 lines
9.6 KiB
C#
Raw Permalink 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.

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;
}
}
}
}