263 lines
9.6 KiB
C#
263 lines
9.6 KiB
C#
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); //默认先播放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<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;
|
||
}
|
||
}
|
||
}
|
||
} |