Files
JJBB/Assets/Project/Script/Obj/Obj_Characters/Obj_CharacterClone.cs
2024-08-23 15:49:34 +08:00

130 lines
4.9 KiB
C#
Raw 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 System.Collections;
using Games.GlobeDefine;
using GCGame.Table;
using UnityEngine;
namespace Games.LogicObj
{
public class Obj_Character_Clone_Init_Data : Obj_Character_Init_Data
{
public Material[] addMaterials;
public CharacterCloneAnimData animData;
public Material baseMaterial;
}
/// <summary>
/// 角色在世界空间的克隆体
/// </summary>
// 主要用于构造角色之后,需要同时修改材质或者其他显示效果的情况
// 仅角色自己可以很容易收获模型加载完成的消息,因此单独开辟一个类
public class Obj_CharacterClone : Obj_Character
{
/// 角色动画需求数据 - 用于处理模型延迟加载的问题
public CharacterCloneAnimData AnimData { get; private set; }
public override bool Init(ObjParent_Init_Data initData1)
{
var result = false;
var initData = initData1 as Obj_Character_Clone_Init_Data;
if (initData != null)
{
ModelID = initData.m_ModelVisualID;
ModelVisualID = 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;
InitMaterialManager();
ClearMaterialMods();
AddMaterialToBodyPart(initData.baseMaterial, initData.addMaterials, ModelPart.body);
AddMaterialToBodyPart(initData.baseMaterial, initData.addMaterials, ModelPart.weaponLeft);
AddMaterialToBodyPart(initData.baseMaterial, initData.addMaterials, ModelPart.weaponRight);
AnimData = initData.animData;
//SetAnim();
if (Profession >= 0)
{
var itemVisual = TableManager.GetItemVisualByID(ModelVisualID, 0);
if (itemVisual == null)
{
ModelVisualID = GlobeVar.DEFAULT_VISUAL_ID;
itemVisual = TableManager.GetItemVisualByID(ModelVisualID, 0);
}
ModelID = GetCharModelID(itemVisual, Profession);
}
var charModel = TableManager.GetCharModelByID(ModelID, 0);
if (charModel != null)
{
result = true;
transform.localScale = Vector3.one * charModel.Scale;
CreateModel(ModelID);
}
}
return result;
}
public override void CreateModel(int modelId, string resPath, string bundlePath, Hashtable table = null,
ObjModelLoadCallback delFinish = null)
{
// Prevent Blinking on reuse.
if (ModelNode.model != null && (ModelNode.targetBundle != bundlePath || ModelNode.targetModel != resPath))
ModelNode.RemoveModel();
base.CreateModel(modelId, resPath, bundlePath, table, delFinish);
}
private void SetAnim()
{
if (ModelNode.model != null)
{
// 注这个流程无法使用AnimLogic执行 - AnimLogic不支持normalizedTime功能。
var animator = ModelNode.model.GetComponentInChildren<Animator>();
if (animator != null)
if (AnimData == null)
animator.speed = 0f;
else
{
animator.enabled = true;
animator.Play(AnimData.animName, 0, AnimData.normalizedTime);
animator.speed = AnimData.animSpeed;
}
}
}
protected override void CreateModelOver(Hashtable hashParam)
{
base.CreateModelOver(hashParam);
SetAnim();
RealoadPlayerWeaponVisual();
ReloadPlayerEffect();
}
private void AddMaterialToBodyPart(Material baseMaterial, Material[] addMaterials, int modelPart)
{
if (addMaterials != null)
for (var i = 0; i < addMaterials.Length; i++)
AddMaterial(addMaterials[i], modelPart);
if (baseMaterial != null)
CreateMaterialMod(baseMaterial, modelPart);
}
//protected override void CreateBlackModelOver(Hashtable hashParam)
//{
// base.CreateBlackModelOver(hashParam);
// RealoadWingModel((int)hashParam["wingId"], 0);
//}
}
/// <summary>
/// 角色克隆体动画数据
/// </summary>
public class CharacterCloneAnimData
{
public string animName;
public float animSpeed = 1f;
public float normalizedTime;
}
}