UniversalViewer/Assets/KF3/Scripts/CharaModelReferencer.cs

293 lines
6.5 KiB
C#
Raw Permalink Normal View History

using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class CharaModelReferencer : MonoBehaviour
{
private void Awake()
{
root = base.transform.Find("root");
if(root != null)
{
boneList.Clear();
MakeBoneList(root);
}
}
private void Update()
{
UpdateOsage();
}
private void LateUpdate()
{
Transform left = boneList.FirstOrDefault(b => b.name == "j_thigh_l");
Transform right = boneList.FirstOrDefault(b => b.name == "j_thigh_r");
LateUpdateOsage(left, right);
}
public void JoinReferenceParam()
{
if (this.refAnimationObj == null) return;
SimpleAnimation component = this.root.GetComponent<SimpleAnimation>();
if (component == null) return;
component.clip = null;
for(int i = component.GetStates().Count() - 1; i >= 0; i--)
{
component.RemoveState(component.GetStates().ToList()[i].name);
}
foreach (CharaModelReferencer.RefAnime refAnime in this.refAnimationObj.GetComponent<CharaModelReferencer>().prefabAnimeList)
{
if (refAnime.clip != null)
{
component.AddState(refAnime.clip, refAnime.name);
}
}
this.rootPos = (this.basePos = this.root.localPosition);
if (this.refAnimationObj.GetComponent<CharaModelReferencer>().scaleParamList.Count > 0)
{
this.root.localPosition = (this.rootPos = new Vector3(this.root.localPosition.x, this.refAnimationObj.GetComponent<CharaModelReferencer>().rootPosY, this.root.localPosition.z));
}
component.gameObject.SetActive(false);
setScaleOne();
foreach (Transform transform in this.boneList)
{
this.setOsage(transform);
this.setScale(transform);
}
component.gameObject.SetActive(true);
}
private void MakeBoneList(Transform bone)
{
if (bone.GetComponent<CharaModelReferencer>() != null)
{
return;
}
if (bone.name.IndexOf("j_") == 0 || bone.name == "root" || bone.name == "pelvis")
{
this.boneList.Add(bone);
}
foreach (object obj in bone)
{
Transform bone2 = (Transform)obj;
this.MakeBoneList(bone2);
}
}
private void setOsage(Transform bone)
{
Osage osage = bone.GetComponent<Osage>();
if (osage == null && bone.name.IndexOf("j_osg") == 0)
{
osage = bone.gameObject.AddComponent<Osage>();
}
CharaModelReferencer.OsageParam osageParam = this.refAnimationObj.GetComponent<CharaModelReferencer>().osageParamList.Find((CharaModelReferencer.OsageParam itm) => itm.boneName == bone.name);
if (osageParam != null)
{
if (osage == null)
{
osage = bone.gameObject.AddComponent<Osage>();
}
osage.boneAxis = osageParam.boneAxis;
osage.stiffnessForce = osageParam.stiffnessForce;
osage.dragForce = osageParam.dragForce;
osage.springForce = osageParam.springForce;
}
else if (osage != null && bone.name.IndexOf("j_osg") != 0)
{
UnityEngine.Object.Destroy(osage);
osage = null;
}
if (osage != null)
{
this.osageList.Add(osage);
}
}
private void setScale(Transform bone)
{
CharaModelReferencer.ScaleParam scaleParam = this.refAnimationObj.GetComponent<CharaModelReferencer>().scaleParamList.Find((CharaModelReferencer.ScaleParam itm) => itm.boneName == bone.name);
if (scaleParam != null)
{
bone.localScale = scaleParam.boneScale;
}
}
public void setScaleOne()
{
if (this.refAnimationObj == null)
{
return;
}
foreach (Transform transform in this.boneList)
{
transform.localScale = Vector3.one;
}
this.root.localPosition = (this.rootPos = Vector3.zero);
}
public void UpdateOsage()
{
if (this.refAnimationObj == null)
{
return;
}
foreach (Osage osage in this.osageList)
{
osage.UpdateOsage();
}
}
public void LateUpdateOsage(Transform thighL, Transform thighR)
{
if (this.refAnimationObj == null)
{
return;
}
foreach (Osage osage in this.osageList)
{
osage.LateUpdateOsage(thighL, thighR);
}
}
public void SetRootPos(bool reset)
{
this.root.localPosition = (reset ? this.basePos : this.rootPos);
}
public void ResetOsage()
{
if (this.refAnimationObj == null)
{
return;
}
foreach (Osage osage in this.osageList)
{
osage.Reset();
}
}
public GameObject refAnimationObj;
private Transform root;
public List<Transform> boneList = new List<Transform>();
private List<Osage> osageList = new List<Osage>();
private Vector3 basePos = Vector3.zero;
private Vector3 rootPos = Vector3.zero;
public CharaMotionDefine.MotionPersonalityType motionPersonalityType;
public List<CharaModelReferencer.RefAnime> prefabAnimeList = new List<CharaModelReferencer.RefAnime>();
public List<CharaModelReferencer.OsageParam> osageParamList = new List<CharaModelReferencer.OsageParam>();
public float rootPosY;
public List<CharaModelReferencer.ScaleParam> scaleParamList = new List<CharaModelReferencer.ScaleParam>();
public Color eyeColor = new Color(0f, 0f, 0f, 0f);
public string tailNodeName = "";
public string earNodeName = "";
public string variantCopyPrefabName = "";
public bool ussVariantCopyPrefabVoice;
[Serializable]
public class RefAnime
{
// Token: 0x06004018 RID: 16408 RVA: 0x001C7E0F File Offset: 0x001C600F
public RefAnime()
{
}
// Token: 0x06004019 RID: 16409 RVA: 0x001C7E30 File Offset: 0x001C6030
public RefAnime(string nam, AnimationClip clp, string se, int eb, int ef, int ea, int tb, int tf, int ta)
{
this.name = nam;
this.clip = clp;
this.seName = se;
this.earBefore = eb;
this.earFrame = ef;
this.earAfter = ea;
this.tailBefore = tb;
this.tailFrame = tf;
this.tailAfter = ta;
}
// Token: 0x0400481C RID: 18460
public string name = "";
// Token: 0x0400481D RID: 18461
public AnimationClip clip;
// Token: 0x0400481E RID: 18462
public string seName = "";
// Token: 0x0400481F RID: 18463
public int earBefore;
// Token: 0x04004820 RID: 18464
public int earFrame;
// Token: 0x04004821 RID: 18465
public int earAfter;
// Token: 0x04004822 RID: 18466
public int tailBefore;
// Token: 0x04004823 RID: 18467
public int tailFrame;
// Token: 0x04004824 RID: 18468
public int tailAfter;
}
[Serializable]
public class OsageParam
{
// Token: 0x04004825 RID: 18469
public string boneName;
// Token: 0x04004826 RID: 18470
public Vector3 boneAxis;
// Token: 0x04004827 RID: 18471
public float stiffnessForce;
// Token: 0x04004828 RID: 18472
public float dragForce;
// Token: 0x04004829 RID: 18473
public Vector3 springForce;
}
[Serializable]
public class ScaleParam
{
// Token: 0x0400482A RID: 18474
public string boneName;
// Token: 0x0400482B RID: 18475
public Vector3 boneScale;
}
}