Files

88 lines
1.8 KiB
C#
Raw Permalink Normal View History

2025-05-13 05:19:58 +03:00
using UnityEngine;
using System.Collections;
public enum DoorState{
Closed,
Closing,
Opened,
Opening
}
public delegate void DoorStateDelegate(Door sender, DoorState from, DoorState to);
public class Door : MonoBehaviour {
private Animator anim;
private float state;
public float speed = 1.0f;
public float direction;
private DoorState doorState;
private SpriteRenderer _renderer;
public event DoorStateDelegate StateChanged;
protected virtual void OnStateChanged (DoorState from, DoorState to)
{
var handler = StateChanged;
if (handler != null)
handler (this, from, to);
}
public DoorState State{
get{return doorState;}
}
// Use this for initialization
void Start () {
anim = gameObject.GetComponent<Animator>();
_renderer = gameObject.GetComponent<SpriteRenderer>();
_renderer.enabled = false;
state = 0;
}
public void Open(){
if((doorState == DoorState.Opened) || (doorState == DoorState.Opening)){
return;
}
OnStateChanged(doorState, DoorState.Opening);
direction = 1.0f;
doorState = DoorState.Opening;
}
public void Close(){
if((doorState == DoorState.Closed) || (doorState == DoorState.Closing)){
return;
}
OnStateChanged(doorState, DoorState.Closing);
doorState = DoorState.Closing;
direction = -1.0f;
}
// Update is called once per frame
void Update () {
if(direction == 0.0f){
return;
}
state = Mathf.Clamp01(state + direction * speed * Time.deltaTime);
_renderer.enabled = state != 0.0f;
if(direction < 0.0f && state == 0.0f){
direction = 0.0f;
OnStateChanged(doorState, DoorState.Closed);
doorState = DoorState.Closed;
}
if(direction > 0.0f && state == 1.0f){
direction = 0.0f;
OnStateChanged(doorState, DoorState.Opened);
doorState = DoorState.Opened;
}
anim.SetFloat("DoorState", state);
}
}