NewN_UAVPlane/Assets/3rdParty/ZFBrowser/Demo/Scripts/Door.cs

88 lines
2.2 KiB
C#

using System;
using UnityEngine;
using System.Collections;
namespace ZenFulcrum.EmbeddedBrowser {
public class Door : MonoBehaviour {
public Vector3 openOffset = new Vector3(0, -6.1f, 0);
[Tooltip("Time to open or close, in seconds.")]
public float openSpeed = 2;
[Tooltip("Number of coins needed to open the door.")]
public int numCoins = 0;
private Vector3 closedPos, openPos;
public enum OpenState {
Open, Closed, Opening, Closing
}
public event Action<OpenState> stateChange = state => {};
private OpenState _state;
public OpenState State {
get { return _state; }
set {
_state = value;
stateChange(_state);
}
}
public void Start() {
closedPos = transform.position;
openPos = transform.position + openOffset;
State = OpenState.Closed;
var browser = GetComponentInChildren<Browser>();
//Tell the interface how many coins we need
browser.CallFunction("setRequiredCoins", numCoins);
browser.RegisterFunction("toggleDoor", args => {
switch ((string)args[0].Check()) {
case "open": Open(); break;
case "close": Close(); break;
case "toggle": Toggle(); break;
}
});
//Update interface when we get a coin
PlayerInventory.Instance.coinCollected += coinCount => {
browser.CallFunction("setCoinCoint", coinCount);
};
}
/** Toggles open state. */
public void Toggle() {
if (State == OpenState.Open || State == OpenState.Opening) Close();
else Open();
}
public void Open() {
if (State == OpenState.Open) return;
State = OpenState.Opening;
}
public void Close() {
if (State == OpenState.Closed) return;
State = OpenState.Closing;
}
public void Update() {
if (State == OpenState.Opening) {
var percent = Vector3.Distance(transform.position, closedPos) / openOffset.magnitude;
percent = Mathf.Min(1, percent + UnityEngine.Time.deltaTime / openSpeed);
transform.position = Vector3.Lerp(closedPos, openPos, percent);
if (percent >= 1) State = OpenState.Open;
} else if (State == OpenState.Closing) {
var percent = Vector3.Distance(transform.position, openPos) / openOffset.magnitude;
percent = Mathf.Min(1, percent + UnityEngine.Time.deltaTime / openSpeed);
transform.position = Vector3.Lerp(openPos, closedPos, percent);
if (percent >= 1) State = OpenState.Closed;
}
}
}
}