An easy to use Unity 3D library for creating illustrated Interactive Fiction games and more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
2.3 KiB

#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
namespace Fungus
{
public class Sequence : MonoBehaviour
{
public string titleText;
[HideInInspector]
public Rect nodeRect = new Rect(10, 10, 100, 100);
[System.NonSerialized]
public SequenceController sequenceController;
[System.NonSerialized]
public FungusCommand activeCommand;
public virtual void Start()
{
// Populate sequenceController reference
Transform parent = transform.parent;
while (parent != null)
{
sequenceController = parent.gameObject.GetComponent<SequenceController>();
if (sequenceController != null)
{
break;
}
}
}
public bool HasError()
{
FungusCommand[] commands = GetComponents<FungusCommand>();
foreach (FungusCommand command in commands)
{
if (command.errorMessage.Length > 0)
{
return true;
}
}
return false;
}
public bool IsRunning()
{
if (sequenceController == null ||
sequenceController.activeSequence == null)
{
return false;
}
return (sequenceController.activeSequence == this);
}
public void ExecuteNextCommand(FungusCommand currentCommand = null)
{
activeCommand = null;
FungusCommand nextCommand = null;
bool executeNext = (currentCommand == null);
FungusCommand[] commands = GetComponents<FungusCommand>();
foreach (FungusCommand command in commands)
{
if (command == currentCommand)
{
executeNext = true;
}
else if (executeNext)
{
nextCommand = command;
break;
}
}
if (nextCommand == null)
{
Finish();
}
else
{
if (sequenceController.stepTime == 0f)
{
activeCommand = nextCommand;
nextCommand.Execute();
}
else
{
StartCoroutine(ExecuteAfterDelay(nextCommand, sequenceController.stepTime));
}
}
}
IEnumerator ExecuteAfterDelay(FungusCommand command, float delay)
{
activeCommand = command;
yield return new WaitForSeconds(delay);
command.Execute();
}
public void Finish()
{
activeCommand = null;
// No more commands to run in current sequence
#if UNITY_EDITOR
Selection.activeGameObject = sequenceController.gameObject;
#endif
}
}
}