using System; using System.Collections; using System.Collections.Generic; using BITKit; using Cysharp.Threading.Tasks; using Cysharp.Threading.Tasks.Triggers; using UnityEngine; using UnityEngine.Animations; namespace BITFALL.Props { public class Prop_ReplaceOnSleep : MonoBehaviour { [SerializeField] private Transform prefab; [SerializeField] private new Rigidbody rigidbody; private readonly IntervalUpdate _interval = new(0.16f); private Collider _collider; private void FixedUpdate() { if (rigidbody.IsSleeping() && _interval.AllowUpdate && _collider) { ReplaceImmediate(_collider.transform); } } public void ReplaceImmediate(Transform root=null) { var _transform = transform; var instance = Instantiate(prefab); instance.SetPositionAndRotation(_transform.position, _transform.rotation); instance.TryGetComponent(out var _rigidbody); if (root is not null && root.gameObject.isStatic is false) { instance.SetParentConstraint(root); var destroyToken = root.gameObject.GetCancellationTokenOnDestroy(); destroyToken.Register(() => { if (!instance) return; if (instance.TryGetComponent(out var constraint)) { Destroy(constraint); } if (instance.TryGetComponent(out var instanceRigidbody)) { instanceRigidbody.isKinematic = false; } }); if (_rigidbody is not null) { //_rigidbody.isKinematic = true; _rigidbody.isKinematic = true; } } else if(_rigidbody is not null) { _rigidbody.velocity = rigidbody.velocity; _rigidbody.angularVelocity = rigidbody.angularVelocity; } Destroy(gameObject); } private void OnCollisionEnter(Collision other) { _collider = other.collider; } private void OnCollisionStay(Collision other) { _collider = other.collider; } } }