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