BITFALL/Assets/Artists/Scripts/Props/Prop_ReplaceOnSleep.cs

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;
}
}
}