75 lines
1.8 KiB
C#
75 lines
1.8 KiB
C#
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<Rigidbody>(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<ParentConstraint>(out var constraint))
|
|
{
|
|
Destroy(constraint);
|
|
}
|
|
|
|
if (instance.TryGetComponent<Rigidbody>(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;
|
|
}
|
|
}
|
|
}
|