unity_native_render_plugin/Assets/Scripts/SceneEffectCharacter.cs
2025-09-25 20:02:14 +08:00

128 lines
3.6 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
namespace X.Rendering.Scene
{
[ExecuteAlways]
[DefaultExecutionOrder(200)]
public class SceneEffectCharacter : MonoBehaviour
{
public uint capsuleAOSettingMask;
[Serializable]
class BoneCapsuleSetting
{
public string BoneName;
public float Radius;
public float Height;
public int Direction;
}
[SerializeField]
private BoneCapsuleSetting[] boneSettings = new BoneCapsuleSetting[]
{
new()
{
BoneName = "Forearm01".ToLowerInvariant(), // 前臂
Radius =0.02f,
Height = 0.2f,
Direction = 0
},
new()
{
BoneName ="UpperArm01".ToLowerInvariant(), // 上臂
Radius =0.02f,
Height = 0.2f,
Direction = 0
},
new()
{
BoneName ="Spine1".ToLowerInvariant(), // 脊柱
Radius =0.1f,
Height = 0.7f,
Direction = 0
},
new()
{
BoneName = "Calf01".ToLowerInvariant(), // 小腿
Radius =0.02f,
Height = 0.6f,
Direction = 0
},
new()
{
BoneName ="Thigh01".ToLowerInvariant(), // 大腿
Radius =0.025f,
Height = 0.4f,
Direction = 0
}
};
[SerializeField]
private List<Transform> capsuleTransforms = new List<Transform>();
private void Awake()
{
#if UNITY_EDITOR
AddCapsule();
#endif
if (capsuleTransforms?.Count == 0)
{
AddCapsule();
}
}
private void AddCapsule()
{
var nodes = this.GetComponentsInChildren<Transform>();
foreach (var item in nodes)
{
if(item.childCount > 0)
{
continue;
}
var goName = item.name.ToLowerInvariant();
for (int i = 0; i < boneSettings.Length; i++)
{
var boneSetting = boneSettings[i];
if(goName.EndsWith(boneSetting.BoneName))
{
if (!item.TryGetComponent<CapsuleCollider>(out var capsuleCollider))
{
capsuleCollider = item.gameObject.AddComponent<CapsuleCollider>();
}
capsuleCollider.enabled = false;
capsuleCollider.direction = boneSetting.Direction;
capsuleCollider.radius = boneSetting.Radius;
capsuleCollider.height = boneSetting.Height;
if(!capsuleTransforms.Contains(item))
{
capsuleTransforms.Add(item);
}
}
}
}
}
#if UNITY_EDITOR
private void OnValidate()
{
capsuleTransforms.Clear();
AddCapsule();
}
#endif
private void OnEnable()
{
SceneEffect.Instance?.AddSceneEffectCharacter(this);
}
private void OnDisable()
{
SceneEffect.Instance?.RmSceneEffectCharacter(this);
}
}
}