BITFALL/Assets/BITKit/Unity/Scripts/Door/PhysicsDoor.cs

74 lines
2.2 KiB
C#
Raw Normal View History

2023-06-08 14:09:50 +08:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace BITKit
{
2023-11-15 23:54:54 +08:00
public class PhysicsDoor : MonoBehaviour, IAction,IDescription
2023-06-08 14:09:50 +08:00
{
public enum State
{
Close,
Open,
HalfOpen,
Locked,
}
2023-11-15 23:54:54 +08:00
[SerializeField] private string description;
2023-10-20 19:31:12 +08:00
[SerializeField] private bool allowPhysics = true;
[SerializeField] private Rigidbody root;
[SerializeField] private Vector3 openEuler;
[SerializeField] private Vector3 closeEuler;
[SerializeField] private State state;
[SerializeField] private Collider[] ignoreColliders;
2023-08-27 02:58:19 +08:00
private void Start()
2023-06-08 14:09:50 +08:00
{
2023-10-20 19:31:12 +08:00
var selfColliders = GetComponentsInChildren<Collider>(true);
var parentCollider = GetComponentInParent<Collider>(true);
foreach (var self in selfColliders)
{
foreach (var ignore in ignoreColliders)
{
Physics.IgnoreCollision(self, ignore, true);
}
if (parentCollider is not null)
Physics.IgnoreCollision(self, parentCollider, true);
}
2023-06-08 14:09:50 +08:00
Set();
}
2023-08-12 01:43:24 +08:00
public void Execute()
2023-06-08 14:09:50 +08:00
{
switch (state)
{
case State.Open:
state = State.Close;
Set();
break;
case State.Close:
state = State.Open;
Set();
break;
}
}
2023-10-20 19:31:12 +08:00
2023-08-27 02:58:19 +08:00
public void Set(bool isClosed)
2023-06-08 14:09:50 +08:00
{
2023-08-27 02:58:19 +08:00
state = isClosed ? State.Close : State.Open;
2023-10-20 19:31:12 +08:00
root.transform.localEulerAngles = isClosed ? closeEuler : openEuler;
if (allowPhysics)
root.isKinematic = isClosed;
2023-06-08 14:09:50 +08:00
}
2023-10-20 19:31:12 +08:00
2023-08-27 02:58:19 +08:00
private void Set()
2023-06-08 14:09:50 +08:00
{
var isClosed = state switch
{
State.Locked => true,
State.Close => true,
State.Open => false,
_ => true
};
Set(isClosed);
}
2023-11-15 23:54:54 +08:00
public string Name => description;
2023-06-08 14:09:50 +08:00
}
}