using System.Collections.Generic; using Unity.Collections; using UnityEngine; namespace X.Rendering.Feature { public class XRenderFeatureManager : MonoBehaviour { public static XRenderFeatureManager Instance { get; private set; } #region CapsuleAO public NativeArray CharacterArray; public NativeArray CapsuleArray; public Transform TestLightTrans; public Transform TestCharacterTrans; public float TestW; private Dictionary characterTransform2CapsuleCollider = new(); private int capsuleColliderCount = 0; public void AddCapsuleAOCharacter(Transform transform) { var oldCapsuleArray = CapsuleArray; var oldCharacterArray = CharacterArray; var capsules = transform.GetComponentsInChildren(true); characterTransform2CapsuleCollider.Add(transform, capsules); capsuleColliderCount += capsules.Length; CapsuleArray = new (capsuleColliderCount, Allocator.Persistent); CharacterArray = new (characterTransform2CapsuleCollider.Count, Allocator.Persistent); if (oldCharacterArray.IsCreated) { oldCharacterArray.Dispose(); oldCapsuleArray.Dispose(); } } public void RemoveCapsuleAOCharacter(Transform transform) { capsuleColliderCount -= characterTransform2CapsuleCollider[transform].Length; characterTransform2CapsuleCollider.Remove(transform); var oldCapsuleArray = CapsuleArray; var oldCharacterArray = CharacterArray; CapsuleArray = new(capsuleColliderCount, Allocator.Persistent); CharacterArray = new(characterTransform2CapsuleCollider.Count, Allocator.Persistent); if (oldCharacterArray.IsCreated) { oldCharacterArray.Dispose(); oldCapsuleArray.Dispose(); } } #endregion private void Awake() { Instance = this; } private void Start() { AddCapsuleAOCharacter(TestCharacterTrans); } private void Update() { Transform transform = null; int capsuleArrayIndex = 0; int characterArrayIndex = 0; int startID = 0; Instance = this; foreach (var item in characterTransform2CapsuleCollider) { for (int i = 0; i < item.Value.Length; i++) { var capsule = item.Value[i]; //capsule.direction var a = capsule.center - new Vector3(0, capsule.height / 2, 0); var b = capsule.center + new Vector3(0, capsule.height / 2, 0); a = capsule.transform.TransformPoint(a); b = capsule.transform.TransformPoint(b); CapsuleArray[capsuleArrayIndex++] = new() { a = a, b = b, radius = capsule.radius, }; } if (transform != item.Key) { transform = item.Key; CharacterArray[characterArrayIndex++] = new() { position = transform.position, radius = 5, lightDir = -new Vector4(TestLightTrans.position.x, TestLightTrans.position.y, TestLightTrans.position.z, -TestW), startID = startID, endID = capsuleArrayIndex, }; startID = capsuleArrayIndex; } } } } }