Hello from TAMA in Tokyo!
am H.T.SAITO as saitot, the other member will join soon :)
Now it's 21:00 JST, the Jam will start from 2:00 am hahaha
The abstract class that I made within last two hours:
using System.Collections; using System.Collections.Generic; using UnityEngine; abstract public class TriggerAction : MonoBehaviour { bool lastTriggerState; // Start is called before the first frame update void Start() { lastTriggerState = gameObject.GetComponent<TriggerManager>().isTriggered; } // Update is called once per frame void Update() { if (gameObject.GetComponent<TriggerManager>().isTriggered) if (lastTriggerState == false) { lastTriggerState = true; OnTriggered(); } else { TriggeredUpdate(); } } protected abstract void OnTriggered(); protected abstract void TriggeredUpdate(); }
Sample code to use TriggerAction abstract class:
public class TriggerActionFly : TriggerAction { protected override void OnTriggered() { gameObject.GetComponent<Renderer>().material.color = Color.red; } protected override void TriggeredUpdate() { gameObject.transform.position += Vector3.right * 0.1f; } }
The TriggerManager class to determine if the object is triggered:
public class TriggerManager : MonoBehaviour
{
public bool isTriggered = false;
public bool requireZoom;
public TriggerManager[] prerequisites; // Start is called before the first frame update
void Start()
{ } // Update is called once per frame
void Update()
{
} public bool pullTrigger(bool isZoomed)
{
// ズームでのトリガを要求するオブジェクトが、非ズーム状態で呼ばれても無視。
if (requireZoom && !isZoomed)
return false; // 前提条件オブジェクトが、トリガを引かれていない状態で存在するならば
// トリガは引かれない。
for (int i = 0; i < prerequisites.Length; i++)
if (prerequisites[i] != null && !prerequisites[i].isTriggered)
return false; // ここまで来たら、自分のトリガを引く。
isTriggered = true;
return true;
}
}
Attach TriggerManger to the GameObject. If it is an object that requires "Zoom" status, check RequireZoom. If there is no prerequisites, it is done. (fig.1)
図1:単独トリガ(ズーム必須)
When the object requires other objects have already triggered, put them into prerequisites list. The object requires all the objects are triggered or destroyed. (fig.2)
図2:トリガ前提条件
Usage sample (fig.3)
void activateObject() { Camera cam = GetComponent<Camera>(); Ray ray = new Ray(cam.transform.position, cam.transform.forward); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { hit.transform.gameObject.GetComponent<TriggerManager>().pullTrigger(isZoomed); } } |
図3:pullTrigger 呼び出し例(ViewController 内に実装ずみ)
To define the actions after the triggers, implement the action class from abstract class TriggerAction. (fig.4) Two protected override functions must be implemented. They are automatically called when the object is once triggered.
Caution: In this class, Update / Start are not called.
図4:トリガが引かれたときの処理(対象オブジェクトの破棄) TriggerActionDestroy.cs
図5:トリガが引かれたら継続して実行したい処理(右へ移動) TriggerActionFly.cs
We just uploaded to itch and forgot to notify here:
https://saitot.itch.io/holy-cave-of-ruins