using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
#if UNITY_EDITOR
|
|
using UnityEditor;
|
|
#endif
|
|
|
|
public class CastleAnimator : MonoBehaviour {
|
|
|
|
public float WaitAtStart = 2;
|
|
public float MoveSpeed = 30;
|
|
public float MaxWaitTime = 5;
|
|
[SerializeField]
|
|
public AnimationCurve SpeedCurve;
|
|
public float BridgeSpeed = 30;
|
|
public float maxBridgeWaitTime = 0.5f;
|
|
[SerializeField]
|
|
public AnimationCurve ScaleCurve;
|
|
|
|
|
|
|
|
|
|
|
|
[System.Serializable]
|
|
public struct Base {
|
|
public GameObject gameObject;
|
|
public Bounds BaseBound;
|
|
public Tower tower;
|
|
}
|
|
|
|
[System.Serializable]
|
|
public struct Tower {
|
|
public Vector3 originalPos;
|
|
public GameObject gameObject;
|
|
public List<GameObject> TowerPieces;
|
|
public GameObject[] ScalePoints;
|
|
}
|
|
|
|
[HideInInspector]
|
|
public List<Base> Bases = new List<Base>();
|
|
|
|
public enum ScaleDirection {PositiveX, PositiveZ, NegativeX, NegativeZ }
|
|
|
|
|
|
public void Start()
|
|
{
|
|
if (MoveSpeed == 0) {
|
|
Debug.LogWarning("Tower Movement set to 0");
|
|
return;
|
|
}
|
|
|
|
foreach(Base Base in Bases) {
|
|
StartCoroutine(MoveTower(Base.tower, MoveSpeed, MaxWaitTime));
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
private IEnumerator MoveTower(Tower tower, float moveSpeed, float startRandomizer)
|
|
{
|
|
|
|
foreach (GameObject scalePoint in tower.ScalePoints) {
|
|
scalePoint.SetActive(false);
|
|
scalePoint.transform.localScale = Vector3.zero;
|
|
}
|
|
|
|
Vector3 endPos = tower.gameObject.transform.position;
|
|
tower.gameObject.transform.localPosition = Vector3.zero;
|
|
|
|
Vector3 startPos = tower.gameObject.transform.position;
|
|
float elapsedTime = 0;
|
|
float randomWait = Random.Range(0, startRandomizer);
|
|
float animationTime = (Vector3.Distance(endPos, startPos) / moveSpeed);
|
|
|
|
yield return new WaitForSeconds(randomWait + WaitAtStart);
|
|
|
|
while (elapsedTime < animationTime) {
|
|
|
|
|
|
float curvePercent = SpeedCurve.Evaluate((elapsedTime / animationTime));
|
|
|
|
tower.gameObject.transform.position = UnclampedLerp(startPos, endPos, curvePercent);
|
|
elapsedTime += Time.deltaTime;
|
|
yield return new WaitForEndOfFrame();
|
|
}
|
|
|
|
tower.gameObject.transform.position = endPos;
|
|
|
|
StartCoroutine(scaleBridge(tower.ScalePoints[0], ScaleDirection.PositiveX, BridgeSpeed,maxBridgeWaitTime));
|
|
StartCoroutine(scaleBridge(tower.ScalePoints[1], ScaleDirection.PositiveZ, BridgeSpeed,maxBridgeWaitTime));
|
|
StartCoroutine(scaleBridge(tower.ScalePoints[2], ScaleDirection.NegativeX, BridgeSpeed,maxBridgeWaitTime));
|
|
StartCoroutine(scaleBridge(tower.ScalePoints[3], ScaleDirection.NegativeZ, BridgeSpeed,maxBridgeWaitTime));
|
|
|
|
}
|
|
|
|
private IEnumerator scaleBridge(GameObject scalePoint, ScaleDirection direction, float scaleSpeed, float startRandomizer)
|
|
{
|
|
|
|
float randomWait = Random.Range(0, startRandomizer);
|
|
yield return new WaitForSeconds(randomWait);
|
|
|
|
scalePoint.SetActive(true);
|
|
|
|
Vector3 scaleVector = Vector3.zero;
|
|
if (direction == ScaleDirection.NegativeX || direction == ScaleDirection.PositiveX) {
|
|
scaleVector = Vector3.right;
|
|
scalePoint.transform.localScale = new Vector3(0, 1, 1);
|
|
} else {
|
|
scaleVector = Vector3.forward;
|
|
scalePoint.transform.localScale = new Vector3(1, 1, 0);
|
|
}
|
|
|
|
Vector3 startScale = scalePoint.transform.localScale;
|
|
|
|
float elapsedTime = 0;
|
|
float animationTime = 10 / scaleSpeed;
|
|
|
|
while (elapsedTime < animationTime) {
|
|
|
|
float curvePercent = ScaleCurve.Evaluate((elapsedTime / animationTime));
|
|
|
|
scalePoint.gameObject.transform.localScale = UnclampedLerp(startScale, Vector3.one, curvePercent);
|
|
elapsedTime += Time.deltaTime;
|
|
yield return new WaitForEndOfFrame();
|
|
}
|
|
|
|
scalePoint.transform.localScale = Vector3.one;
|
|
}
|
|
|
|
public static Vector3 UnclampedLerp(Vector3 a, Vector3 b, float t)
|
|
{
|
|
return t * b + (1 - t) * a;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private Bounds getWorldBounds(GameObject input)
|
|
{
|
|
Bounds retVal = new Bounds(input.transform.position, Vector3.zero);
|
|
|
|
foreach (Renderer renderer in input.GetComponentsInChildren<Renderer>()) {
|
|
retVal.Encapsulate(renderer.bounds);
|
|
}
|
|
|
|
return retVal;
|
|
}
|
|
|
|
private void MoveParent(GameObject input, Vector3 moveTo)
|
|
{
|
|
Vector3 movement = moveTo - input.transform.position;
|
|
|
|
input.transform.position = moveTo;
|
|
|
|
foreach (Transform child in input.transform) {
|
|
child.position -= movement;
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
#if UNITY_EDITOR
|
|
public void AddBase(Transform input)
|
|
{
|
|
Base newBase = new Base();
|
|
GameObject Base = new GameObject();
|
|
Undo.RegisterCreatedObjectUndo(Base, "Created Base");
|
|
|
|
Base.transform.position = getWorldBounds(input.gameObject).center;
|
|
Base.transform.parent = transform;
|
|
Base.name = "Base" + Bases.Count;
|
|
|
|
Undo.SetTransformParent(input.transform, Base.transform, "Created Base");
|
|
//newBaseObject.parent = Base.transform;
|
|
newBase.gameObject = Base;
|
|
Undo.RecordObject(this, "Created Base");
|
|
|
|
GameObject towerHolder = new GameObject();
|
|
towerHolder.transform.parent = Base.transform;
|
|
towerHolder.transform.localPosition = Vector3.zero;
|
|
towerHolder.name = "Tower Holder" + Bases.Count;
|
|
|
|
newBase.tower = new Tower();
|
|
newBase.tower.gameObject = towerHolder;
|
|
newBase.tower.TowerPieces = new List<GameObject>();
|
|
|
|
newBase.tower.ScalePoints = new GameObject[4];
|
|
for (int i = 0; i < 4; i++) {
|
|
newBase.tower.ScalePoints[i] = new GameObject();
|
|
newBase.tower.ScalePoints[i].transform.parent = Base.transform;
|
|
newBase.tower.ScalePoints[i].transform.localPosition = Vector3.zero;
|
|
newBase.tower.ScalePoints[i].name = "ScalePoint" + Bases.Count + ", " + i;
|
|
}
|
|
|
|
Bases.Add(newBase);
|
|
}
|
|
|
|
public void AddTower(Base selectedBase, Transform[] input)
|
|
{
|
|
Undo.RecordObject(this, "Added Tower");
|
|
foreach (Transform towerObject in input) {
|
|
if (towerObject == selectedBase.gameObject.transform)
|
|
continue;
|
|
|
|
if (selectedBase.tower.TowerPieces.Contains(towerObject.gameObject))
|
|
continue;
|
|
|
|
selectedBase.tower.TowerPieces.Add(towerObject.gameObject);
|
|
Undo.SetTransformParent(towerObject.transform, selectedBase.tower.gameObject.transform, "Added Tower");
|
|
|
|
|
|
}
|
|
|
|
Undo.RecordObject(selectedBase.tower.gameObject, "Added Tower");
|
|
|
|
MoveParent(selectedBase.tower.gameObject, selectedBase.gameObject.transform.position + ((getWorldBounds(selectedBase.tower.gameObject).size.y) * Vector3.up));
|
|
selectedBase.tower.originalPos = selectedBase.tower.gameObject.transform.position;
|
|
}
|
|
|
|
public void AddBridge(Base selectedBase,ScaleDirection direction, Transform[] input)
|
|
{
|
|
|
|
foreach (Transform bridgeObject in input) {
|
|
if (bridgeObject == selectedBase.gameObject)
|
|
continue;
|
|
|
|
if (selectedBase.tower.TowerPieces.Contains(bridgeObject.gameObject))
|
|
continue;
|
|
|
|
Undo.SetTransformParent(bridgeObject.transform, selectedBase.tower.ScalePoints[(int)direction].transform, "Added Bridge");
|
|
}
|
|
}
|
|
|
|
public string[] GetBaseNames()
|
|
{
|
|
string[] retVal = new string[Bases.Count];
|
|
|
|
for (int i = 0; i < retVal.Length; i++) {
|
|
retVal[i] = "Tower" + i;
|
|
}
|
|
return retVal;
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|