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 onModelUpdate; public const int startShowId = 31; public const int idleShowId = 0; public List starShowEffects = new List(); 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 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(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.receiveShadows = false; meshRenderer.shadowCastingMode = ShadowCastingMode.Off; // 注:这个仍然会走常规初始化到Idle的动画流程,然后用这个StartShow覆盖Idle动画指令 if (AnimLogic != null && AnimLogic.gameObject.activeSelf) { _nextAnimTime = Time.unscaledTime + startShowInterval; AnimLogic.PlayStartShow(idleShowId); //默认先播放Idle,UI动作延迟检测,没有就不播放(缓冲池取出来的同类型资源未重置状态机) } 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(); 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; } } } }