|
|
|
@ -5,402 +5,432 @@ using UnityEngine.Events; |
|
|
|
using UnityEngine.EventSystems; |
|
|
|
using UnityEngine.EventSystems; |
|
|
|
using UnityEngine.UI; |
|
|
|
using UnityEngine.UI; |
|
|
|
|
|
|
|
|
|
|
|
public class CharacterBehaviour : MonoBehaviour |
|
|
|
namespace UltraCombos.Frozen |
|
|
|
{ |
|
|
|
{ |
|
|
|
public float videoStopTime = 1.5f; |
|
|
|
public class CharacterBehaviour : MonoBehaviour |
|
|
|
[Range(0, 15)] |
|
|
|
{ |
|
|
|
public float disappearTime = 5; |
|
|
|
public List<State> appearSataes = new List<State>(); |
|
|
|
|
|
|
|
|
|
|
|
public Area area; |
|
|
|
public float videoStopTime = 1.5f; |
|
|
|
public List<Area> AppearArea = new List<Area>(); |
|
|
|
public float disappearTime = 5.0f; |
|
|
|
|
|
|
|
|
|
|
|
Vector2 wallRoi; |
|
|
|
public Area area; |
|
|
|
float origin_height = 0.0f; |
|
|
|
public List<Area> appearAreas = new List<Area>(); |
|
|
|
|
|
|
|
|
|
|
|
[SerializeField] |
|
|
|
Vector2 wallRoi; |
|
|
|
List<CharacterDummy> specificPositions = new List<CharacterDummy>(); |
|
|
|
float origin_height = 0.0f; |
|
|
|
|
|
|
|
|
|
|
|
[SerializeField, Range(0, 1)] |
|
|
|
[SerializeField] |
|
|
|
float roaming = 0.0f; |
|
|
|
List<CharacterDummy> specificPositions = new List<CharacterDummy>(); |
|
|
|
float roaming_seed = 0.0f; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[SerializeField] |
|
|
|
[SerializeField, Range(0, 1)] |
|
|
|
private RectTransform fakeButton; |
|
|
|
float roaming = 0.0f; |
|
|
|
|
|
|
|
float roaming_seed = 0.0f; |
|
|
|
|
|
|
|
|
|
|
|
[Header("DShow Player")] |
|
|
|
[SerializeField] |
|
|
|
[SerializeField] |
|
|
|
private RectTransform fakeButton; |
|
|
|
bool isStandbyLoop = true; |
|
|
|
|
|
|
|
public DShowClip standbyClip; |
|
|
|
|
|
|
|
public List<DShowClip> triggerClips = new List<DShowClip>(); |
|
|
|
|
|
|
|
int trigger_clip_index = 0; |
|
|
|
|
|
|
|
//[SerializeField] |
|
|
|
|
|
|
|
private DShowMoviePlayer[] players; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[Header("Event")] |
|
|
|
[Header("DShow Player")] |
|
|
|
[SerializeField] |
|
|
|
[SerializeField] |
|
|
|
UnityEvent onTrigger = new UnityEvent(); |
|
|
|
bool isStandbyLoop = true; |
|
|
|
|
|
|
|
public DShowClip standbyClip; |
|
|
|
|
|
|
|
public List<DShowClip> triggerClips = new List<DShowClip>(); |
|
|
|
|
|
|
|
int trigger_clip_index = 0; |
|
|
|
|
|
|
|
//[SerializeField] |
|
|
|
|
|
|
|
private DShowMoviePlayer[] players; |
|
|
|
|
|
|
|
|
|
|
|
enum State |
|
|
|
[Header("Event")] |
|
|
|
{ |
|
|
|
[SerializeField] |
|
|
|
TRIGGER = 0, |
|
|
|
UnityEvent onTrigger = new UnityEvent(); |
|
|
|
STANDBY = 1, |
|
|
|
|
|
|
|
SLEEP = 2 |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
State state = State.SLEEP; |
|
|
|
enum Status |
|
|
|
DShowMoviePlayer StatePlayer { get { return players[(int)state]; } } |
|
|
|
{ |
|
|
|
MeshRenderer StateRenderer { get { return renderers[(int)state]; } } |
|
|
|
TRIGGER = 0, |
|
|
|
|
|
|
|
STANDBY = 1, |
|
|
|
|
|
|
|
SLEEP = 2 |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
MeshRenderer[] renderers; |
|
|
|
Status status = Status.SLEEP; |
|
|
|
|
|
|
|
DShowMoviePlayer StatePlayer { get { return players[(int)status]; } } |
|
|
|
|
|
|
|
MeshRenderer StateRenderer { get { return renderers[(int)status]; } } |
|
|
|
|
|
|
|
|
|
|
|
bool isTriggered = false; |
|
|
|
MeshRenderer[] renderers; |
|
|
|
|
|
|
|
|
|
|
|
Coroutine flow = null; |
|
|
|
bool isTriggered = false; |
|
|
|
|
|
|
|
|
|
|
|
[SerializeField, Header("Debug")] |
|
|
|
Coroutine flow = null; |
|
|
|
bool mode = false; |
|
|
|
|
|
|
|
[SerializeField] |
|
|
|
|
|
|
|
string info; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void Awake() |
|
|
|
bool is_alive = false; |
|
|
|
{ |
|
|
|
const float alive_threshold = 1.0f / 255.0f; |
|
|
|
renderers = GetComponentsInChildren<MeshRenderer>(); |
|
|
|
float alive_value = 0.0f; |
|
|
|
if (renderers.Length != 2) |
|
|
|
|
|
|
|
Debug.LogWarningFormat("{0} renderer count is {1}", gameObject.name, renderers.Length); |
|
|
|
|
|
|
|
//m_meshRender = GetComponent<MeshRenderer>(); |
|
|
|
|
|
|
|
//mat = new Material(Shader.Find("Unlit/ColorTransparent")); |
|
|
|
|
|
|
|
//m_meshRender.material = mat; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[SerializeField, Header("Debug")] |
|
|
|
|
|
|
|
bool mode = false; |
|
|
|
|
|
|
|
[SerializeField] |
|
|
|
|
|
|
|
string info; |
|
|
|
|
|
|
|
|
|
|
|
origin_height = transform.position.y; |
|
|
|
private void Awake() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
renderers = GetComponentsInChildren<MeshRenderer>(); |
|
|
|
|
|
|
|
if (renderers.Length != 2) |
|
|
|
|
|
|
|
Debug.LogWarningFormat("{0} renderer count is {1}", gameObject.name, renderers.Length); |
|
|
|
|
|
|
|
//m_meshRender = GetComponent<MeshRenderer>(); |
|
|
|
|
|
|
|
//mat = new Material(Shader.Find("Unlit/ColorTransparent")); |
|
|
|
|
|
|
|
//m_meshRender.material = mat; |
|
|
|
|
|
|
|
|
|
|
|
InitialiseDSPlayer(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void InitialiseDSPlayer() |
|
|
|
origin_height = transform.position.y; |
|
|
|
{ |
|
|
|
|
|
|
|
CreateDSPlayer(triggerClips[0]); |
|
|
|
|
|
|
|
CreateDSPlayer(standbyClip); |
|
|
|
|
|
|
|
players = GetComponentsInChildren<DShowMoviePlayer>(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void CreateDSPlayer(DShowClip clip) |
|
|
|
InitialiseDSPlayer(); |
|
|
|
{ |
|
|
|
} |
|
|
|
GameObject triggerObj = new GameObject(clip.name); |
|
|
|
|
|
|
|
triggerObj.transform.parent = this.transform; |
|
|
|
|
|
|
|
var player = triggerObj.AddComponent<DShowMoviePlayer>(); |
|
|
|
|
|
|
|
player.VideoAsset = clip; |
|
|
|
|
|
|
|
player.Load(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void InitialTouchButton() |
|
|
|
void InitialiseDSPlayer() |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (fakeButton != null) |
|
|
|
CreateDSPlayer(triggerClips[0]); |
|
|
|
return; |
|
|
|
CreateDSPlayer(standbyClip); |
|
|
|
GameObject obj = new GameObject(gameObject.name); |
|
|
|
players = GetComponentsInChildren<DShowMoviePlayer>(); |
|
|
|
obj.transform.parent = GameObject.Find("Final Canvas").transform; |
|
|
|
} |
|
|
|
fakeButton = obj.AddComponent<RectTransform>(); |
|
|
|
|
|
|
|
fakeButton.anchorMin = new Vector2(0, 0); |
|
|
|
|
|
|
|
fakeButton.anchorMax = new Vector2(0, 0); |
|
|
|
|
|
|
|
fakeButton.pivot = new Vector2(0.5f, 0.5f); |
|
|
|
|
|
|
|
var standby_scale = renderers[(int)State.STANDBY].transform.localScale; |
|
|
|
|
|
|
|
fakeButton.sizeDelta = new Vector2(standby_scale.x, standby_scale.y) * FrozenScreenToWorldSpace.Instance.finalPixelsByMeter; |
|
|
|
|
|
|
|
fakeButton.anchoredPosition3D = new Vector3(0, 0, 0); |
|
|
|
|
|
|
|
fakeButton.localScale = Vector3.one; |
|
|
|
|
|
|
|
fakeButton.gameObject.AddComponent<RawImage>(); |
|
|
|
|
|
|
|
fakeButton.GetComponent<RawImage>().color = new Color(1, 1, 1, 0); |
|
|
|
|
|
|
|
TouchArea touch_area = fakeButton.gameObject.AddComponent<TouchArea>(); |
|
|
|
|
|
|
|
touch_area.PointerDown.AddListener((data) => { Trigger(data); }); |
|
|
|
|
|
|
|
touch_area.PointerDrag.AddListener((data) => { Trigger(data); }); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void Start() |
|
|
|
void CreateDSPlayer(DShowClip clip) |
|
|
|
{ |
|
|
|
|
|
|
|
foreach (var rdr in renderers) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
rdr.material.mainTextureScale = new Vector2(1, -1); |
|
|
|
GameObject triggerObj = new GameObject(clip.name); |
|
|
|
rdr.material.mainTextureOffset = new Vector2(0, -1); |
|
|
|
triggerObj.transform.parent = this.transform; |
|
|
|
|
|
|
|
var player = triggerObj.AddComponent<DShowMoviePlayer>(); |
|
|
|
|
|
|
|
player.VideoAsset = clip; |
|
|
|
|
|
|
|
player.Load(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void OnEnable() |
|
|
|
void InitialTouchButton() |
|
|
|
{ |
|
|
|
{ |
|
|
|
InitialTouchButton(); |
|
|
|
if (fakeButton != null) |
|
|
|
ResetFlow(); |
|
|
|
return; |
|
|
|
//standby = true; |
|
|
|
GameObject obj = new GameObject(gameObject.name); |
|
|
|
//isSleep = false; |
|
|
|
obj.transform.parent = GameObject.Find("Final Canvas").transform; |
|
|
|
//StartCoroutine(PlayStandbyOnStart()); |
|
|
|
fakeButton = obj.AddComponent<RectTransform>(); |
|
|
|
|
|
|
|
fakeButton.anchorMin = new Vector2(0, 0); |
|
|
|
//StartCoroutine(RandomPosNoTriggerOther()); |
|
|
|
fakeButton.anchorMax = new Vector2(0, 0); |
|
|
|
//color = new Color(1, 1, 1, 0); |
|
|
|
fakeButton.pivot = new Vector2(0.5f, 0.5f); |
|
|
|
//StartCoroutine(Sleep()); |
|
|
|
var standby_scale = renderers[(int)Status.STANDBY].transform.localScale; |
|
|
|
if (fakeButton != null) |
|
|
|
fakeButton.sizeDelta = new Vector2(standby_scale.x, standby_scale.y) * FrozenScreenToWorldSpace.Instance.finalPixelsByMeter; |
|
|
|
fakeButton.gameObject.SetActive(true); |
|
|
|
fakeButton.anchoredPosition3D = new Vector3(0, 0, 0); |
|
|
|
} |
|
|
|
fakeButton.localScale = Vector3.one; |
|
|
|
|
|
|
|
fakeButton.gameObject.AddComponent<RawImage>(); |
|
|
|
|
|
|
|
fakeButton.GetComponent<RawImage>().color = new Color(1, 1, 1, 0); |
|
|
|
|
|
|
|
TouchArea touch_area = fakeButton.gameObject.AddComponent<TouchArea>(); |
|
|
|
|
|
|
|
touch_area.PointerDown.AddListener((data) => { Trigger(data); }); |
|
|
|
|
|
|
|
touch_area.PointerDrag.AddListener((data) => { Trigger(data); }); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void OnDisable() |
|
|
|
private void Start() |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (fakeButton != null) |
|
|
|
foreach (var rdr in renderers) |
|
|
|
fakeButton.gameObject.SetActive(false); |
|
|
|
{ |
|
|
|
} |
|
|
|
rdr.material.mainTextureScale = new Vector2(1, -1); |
|
|
|
|
|
|
|
rdr.material.mainTextureOffset = new Vector2(0, -1); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void ResetFlow() |
|
|
|
private void OnEnable() |
|
|
|
{ |
|
|
|
|
|
|
|
if (flow != null) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
StopCoroutine(flow); |
|
|
|
InitialTouchButton(); |
|
|
|
flow = null; |
|
|
|
ResetFlow(); |
|
|
|
|
|
|
|
//standby = true; |
|
|
|
|
|
|
|
//isSleep = false; |
|
|
|
|
|
|
|
//StartCoroutine(PlayStandbyOnStart()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//StartCoroutine(RandomPosNoTriggerOther()); |
|
|
|
|
|
|
|
//color = new Color(1, 1, 1, 0); |
|
|
|
|
|
|
|
//StartCoroutine(Sleep()); |
|
|
|
|
|
|
|
if (fakeButton != null) |
|
|
|
|
|
|
|
fakeButton.gameObject.SetActive(true); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void OnDisable() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (fakeButton != null) |
|
|
|
|
|
|
|
fakeButton.gameObject.SetActive(false); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
isTriggered = false; |
|
|
|
public bool Active |
|
|
|
foreach (var rdr in renderers) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
rdr.material.color = new Color(1, 1, 1, 0); |
|
|
|
set |
|
|
|
rdr.material.SetColor("_TintColor", new Color(1, 1, 1, 0)); |
|
|
|
{ |
|
|
|
|
|
|
|
if (value) Activate(); |
|
|
|
|
|
|
|
else Deactivate(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
foreach (var ply in players) |
|
|
|
|
|
|
|
|
|
|
|
public void Activate() |
|
|
|
{ |
|
|
|
{ |
|
|
|
ply.Pause(); |
|
|
|
if (is_alive) |
|
|
|
ply.Frame = 0; |
|
|
|
return; |
|
|
|
|
|
|
|
is_alive = true; |
|
|
|
|
|
|
|
gameObject.SetActive(true); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
flow = StartCoroutine(Flow()); |
|
|
|
public void Deactivate() |
|
|
|
} |
|
|
|
{ |
|
|
|
|
|
|
|
if (is_alive == false) |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
is_alive = false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
IEnumerator Flow() |
|
|
|
|
|
|
|
{ |
|
|
|
private void ResetFlow() |
|
|
|
if (mode) info = "setup"; |
|
|
|
|
|
|
|
// setup |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
if (specificPositions.Count > 0) |
|
|
|
if (flow != null) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
StopCoroutine(flow); |
|
|
|
|
|
|
|
flow = null; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
isTriggered = false; |
|
|
|
|
|
|
|
foreach (var rdr in renderers) |
|
|
|
{ |
|
|
|
{ |
|
|
|
SetSpecificPos(); |
|
|
|
rdr.material.color = new Color(1, 1, 1, 0); |
|
|
|
|
|
|
|
rdr.material.SetColor("_TintColor", new Color(1, 1, 1, 0)); |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
foreach (var ply in players) |
|
|
|
{ |
|
|
|
{ |
|
|
|
RandomAppearWall(); |
|
|
|
ply.Pause(); |
|
|
|
|
|
|
|
ply.Frame = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
roaming_seed = Random.Range(0.0f, 1.0f); |
|
|
|
flow = StartCoroutine(Flow()); |
|
|
|
|
|
|
|
|
|
|
|
trigger_clip_index = ++trigger_clip_index % triggerClips.Count; |
|
|
|
|
|
|
|
players[(int)State.TRIGGER].VideoAsset = triggerClips[trigger_clip_index]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
yield return null; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (mode) info = "STANDBY"; |
|
|
|
IEnumerator Flow() |
|
|
|
// standby |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
state = State.STANDBY; |
|
|
|
if (mode) info = "setup"; |
|
|
|
var player = StatePlayer; |
|
|
|
// setup |
|
|
|
player.Loop = isStandbyLoop; |
|
|
|
{ |
|
|
|
player.Play(); |
|
|
|
if (specificPositions.Count > 0) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
SetSpecificPos(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
RandomAppearWall(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
roaming_seed = Random.Range(0.0f, 1.0f); |
|
|
|
|
|
|
|
|
|
|
|
while (isTriggered == false) |
|
|
|
trigger_clip_index = ++trigger_clip_index % triggerClips.Count; |
|
|
|
|
|
|
|
players[(int)Status.TRIGGER].VideoAsset = triggerClips[trigger_clip_index]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
yield return null; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (mode) info = "STANDBY"; |
|
|
|
|
|
|
|
// standby |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (mode) info = "STANDBY is not triggered"; |
|
|
|
status = Status.STANDBY; |
|
|
|
|
|
|
|
var player = StatePlayer; |
|
|
|
|
|
|
|
player.Loop = isStandbyLoop; |
|
|
|
|
|
|
|
player.Play(); |
|
|
|
|
|
|
|
|
|
|
|
if (player.Loop == false) |
|
|
|
while (isTriggered == false) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (player.IsPlaying == false) |
|
|
|
if (mode) info = "STANDBY is not triggered"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (player.Loop == false) |
|
|
|
{ |
|
|
|
{ |
|
|
|
//player.Pause(); |
|
|
|
if (player.IsPlaying == false) |
|
|
|
//player.Frame = player.TotalNumFrames; |
|
|
|
{ |
|
|
|
if (mode) info = "STANDBY is not triggered and set frame"; |
|
|
|
//player.Pause(); |
|
|
|
|
|
|
|
//player.Frame = player.TotalNumFrames; |
|
|
|
|
|
|
|
if (mode) info = "STANDBY is not triggered and set frame"; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
yield return null; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
yield return null; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (mode) info = "TRIGGER"; |
|
|
|
|
|
|
|
// trigger |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
onTrigger.Invoke(); |
|
|
|
|
|
|
|
status = Status.TRIGGER; |
|
|
|
|
|
|
|
var player = StatePlayer; |
|
|
|
|
|
|
|
player.Play(); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
while (player.IsPlaying) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (mode) info = "TRIGGER is playing"; |
|
|
|
|
|
|
|
yield return null; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (mode) info = "TRIGGER"; |
|
|
|
player.Pause(); |
|
|
|
// trigger |
|
|
|
player.Frame = player.TotalNumFrames; |
|
|
|
{ |
|
|
|
|
|
|
|
onTrigger.Invoke(); |
|
|
|
|
|
|
|
state = State.TRIGGER; |
|
|
|
|
|
|
|
var player = StatePlayer; |
|
|
|
|
|
|
|
player.Play(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (player.IsPlaying) |
|
|
|
if (mode) info = "TRIGGER is stopped"; |
|
|
|
{ |
|
|
|
yield return new WaitForSeconds(videoStopTime); |
|
|
|
if (mode) info = "TRIGGER is playing"; |
|
|
|
|
|
|
|
yield return null; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
player.Pause(); |
|
|
|
if (mode) info = "SLEEP"; |
|
|
|
player.Frame = player.TotalNumFrames; |
|
|
|
// sleep |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
status = Status.SLEEP; |
|
|
|
|
|
|
|
yield return new WaitForSeconds(disappearTime); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (mode) info = "TRIGGER is stopped"; |
|
|
|
flow = null; |
|
|
|
yield return new WaitForSeconds(videoStopTime); |
|
|
|
yield return null; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (mode) info = "SLEEP"; |
|
|
|
void Update() |
|
|
|
// sleep |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
state = State.SLEEP; |
|
|
|
alive_value = Mathf.Lerp(alive_value, is_alive ? 1.0f : 0.0f, Time.deltaTime); |
|
|
|
yield return new WaitForSeconds(disappearTime); |
|
|
|
if (is_alive == false && alive_value < alive_threshold) |
|
|
|
} |
|
|
|
{ |
|
|
|
|
|
|
|
alive_value = 0.0f; |
|
|
|
|
|
|
|
gameObject.SetActive(false); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
flow = null; |
|
|
|
|
|
|
|
yield return null; |
|
|
|
for (int i = 0; i < players.Length; i++) |
|
|
|
} |
|
|
|
|
|
|
|
/* |
|
|
|
|
|
|
|
IEnumerator PlayStandbyOnStart() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
DShowMoviePlayer player = CurrentPlayer; |
|
|
|
|
|
|
|
player.Loop = isStandbyLoop; |
|
|
|
|
|
|
|
while (!player.IsPlaying) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
player.Play(); |
|
|
|
|
|
|
|
renderers[STANDBY].material.mainTexture = player.Texture; |
|
|
|
|
|
|
|
yield return null; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
void Update() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
for (int i = 0; i < players.Length; i++) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (players[i].IsPlaying) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
renderers[i].material.mainTexture = players[i].Texture; |
|
|
|
if (players[i].IsPlaying) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
renderers[i].material.mainTexture = players[i].Texture; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
// standby material |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
float smooth = Time.deltaTime * 2.0f; |
|
|
|
|
|
|
|
if (status != Status.STANDBY && isStandbyLoop == false) |
|
|
|
|
|
|
|
smooth = 1.0f; |
|
|
|
|
|
|
|
float alpha = System.Convert.ToInt32(status == Status.STANDBY); |
|
|
|
|
|
|
|
alpha = Mathf.Min(alpha, alive_value); |
|
|
|
|
|
|
|
var mat = renderers[(int)Status.STANDBY].material; |
|
|
|
|
|
|
|
var col = new Color(1, 1, 1, Mathf.Lerp(mat.color.a, alpha, smooth)); |
|
|
|
|
|
|
|
mat.color = col; |
|
|
|
|
|
|
|
mat.SetColor("_TintColor", col); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// standby material |
|
|
|
// trigger material |
|
|
|
{ |
|
|
|
{ |
|
|
|
float smooth = Time.deltaTime * 2.0f; |
|
|
|
float smooth = Time.deltaTime * 2.0f; |
|
|
|
if (state != State.STANDBY && isStandbyLoop == false) |
|
|
|
if (status == Status.TRIGGER) |
|
|
|
smooth = 1.0f; |
|
|
|
smooth = 1.0f; |
|
|
|
float alpha = System.Convert.ToInt32(state == State.STANDBY); |
|
|
|
float alpha = System.Convert.ToInt32(status == Status.TRIGGER); |
|
|
|
var mat = renderers[(int)State.STANDBY].material; |
|
|
|
alpha = Mathf.Min(alpha, alive_value); |
|
|
|
var col = new Color(1, 1, 1, Mathf.Lerp(mat.color.a, alpha, smooth)); |
|
|
|
var mat = renderers[(int)Status.TRIGGER].material; |
|
|
|
mat.color = col; |
|
|
|
var col = new Color(1, 1, 1, Mathf.Lerp(mat.color.a, alpha, smooth)); |
|
|
|
mat.SetColor("_TintColor", col); |
|
|
|
mat.color = col; |
|
|
|
} |
|
|
|
mat.SetColor("_TintColor", col); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// trigger material |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
float smooth = Time.deltaTime * 2.0f; |
|
|
|
|
|
|
|
if (state == State.TRIGGER) |
|
|
|
|
|
|
|
smooth = 1.0f; |
|
|
|
|
|
|
|
float alpha = System.Convert.ToInt32(state == State.TRIGGER); |
|
|
|
|
|
|
|
var mat = renderers[(int)State.TRIGGER].material; |
|
|
|
|
|
|
|
var col = new Color(1, 1, 1, Mathf.Lerp(mat.color.a, alpha, smooth)); |
|
|
|
|
|
|
|
mat.color = col; |
|
|
|
|
|
|
|
mat.SetColor("_TintColor", col); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
switch (status) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
case Status.STANDBY: |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (roaming > 0.0f) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
UpdateRoamingPosition(); |
|
|
|
|
|
|
|
UpdateWallRoiFromPosition(); |
|
|
|
|
|
|
|
UpdateButtonPos(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case Status.TRIGGER: |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
switch (state) |
|
|
|
} |
|
|
|
{ |
|
|
|
break; |
|
|
|
case State.STANDBY: |
|
|
|
case Status.SLEEP: |
|
|
|
{ |
|
|
|
|
|
|
|
if (roaming > 0.0f) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
UpdateRoamingPosition(); |
|
|
|
|
|
|
|
UpdateWallRoiFromPosition(); |
|
|
|
|
|
|
|
UpdateButtonPos(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
case State.TRIGGER: |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
if (mode) |
|
|
|
break; |
|
|
|
{ |
|
|
|
case State.SLEEP: |
|
|
|
if (Input.GetKeyDown(KeyCode.R)) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
ResetFlow(); |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (flow == null) |
|
|
|
|
|
|
|
ResetFlow(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (mode) |
|
|
|
void UpdateRoamingPosition() |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (Input.GetKeyDown(KeyCode.R)) |
|
|
|
float noise = Mathf.PerlinNoise(Time.time * 0.4f, roaming_seed) > 0.5f ? 1.0f : -1.0f; |
|
|
|
|
|
|
|
noise *= roaming * Time.deltaTime; |
|
|
|
|
|
|
|
//float padding = transform.localScale.x * 0.5f; |
|
|
|
|
|
|
|
float padding = renderers[(int)Status.TRIGGER].transform.localScale.x * 0.5f; |
|
|
|
|
|
|
|
Vector3 pos = transform.position; |
|
|
|
|
|
|
|
switch (area) |
|
|
|
{ |
|
|
|
{ |
|
|
|
ResetFlow(); |
|
|
|
case Area.TopWall: |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
float minmax = Mathf.Abs(padding - FrozenScreenToWorldSpace.Instance.width * 0.5f); |
|
|
|
|
|
|
|
float shift = FrozenScreenToWorldSpace.Instance.Position.x; |
|
|
|
|
|
|
|
float x = Mathf.Clamp(pos.x + noise, -minmax + shift, minmax + shift); |
|
|
|
|
|
|
|
transform.position = new Vector3(x, pos.y, pos.z); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case Area.LeftWall: |
|
|
|
|
|
|
|
case Area.RightWall: |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
float minmax = Mathf.Abs(padding - FrozenScreenToWorldSpace.Instance.length * 0.5f); |
|
|
|
|
|
|
|
float shift = FrozenScreenToWorldSpace.Instance.Position.z; |
|
|
|
|
|
|
|
float z = Mathf.Clamp(pos.z + noise, -minmax + shift, minmax + shift); |
|
|
|
|
|
|
|
transform.position = new Vector3(pos.x, pos.y, z); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (flow == null) |
|
|
|
void RandomAppearWall() |
|
|
|
ResetFlow(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void UpdateRoamingPosition() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
float noise = Mathf.PerlinNoise(Time.time * 0.4f, roaming_seed) > 0.5f ? 1.0f : -1.0f; |
|
|
|
|
|
|
|
noise *= roaming * Time.deltaTime; |
|
|
|
|
|
|
|
//float padding = transform.localScale.x * 0.5f; |
|
|
|
|
|
|
|
float padding = renderers[(int)State.TRIGGER].transform.localScale.x * 0.5f; |
|
|
|
|
|
|
|
Vector3 pos = transform.position; |
|
|
|
|
|
|
|
switch (area) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
case Area.TopWall: |
|
|
|
Vector3 newPos = Vector3.zero; |
|
|
|
{ |
|
|
|
area = appearAreas[Random.Range(0, appearAreas.Count)]; |
|
|
|
float minmax = Mathf.Abs(padding - FrozenScreenToWorldSpace.Instance.width * 0.5f); |
|
|
|
Quaternion q = new Quaternion(); |
|
|
|
float shift = FrozenScreenToWorldSpace.Instance.Position.x; |
|
|
|
if (area == Area.LeftWall) |
|
|
|
float x = Mathf.Clamp(pos.x + noise, -minmax + shift, minmax + shift); |
|
|
|
{ |
|
|
|
transform.position = new Vector3(x, pos.y, pos.z); |
|
|
|
newPos.x = -FrozenScreenToWorldSpace.Instance.width / 2; |
|
|
|
} |
|
|
|
q.SetLookRotation(Vector3.left); |
|
|
|
break; |
|
|
|
} |
|
|
|
case Area.LeftWall: |
|
|
|
if (area == Area.RightWall) |
|
|
|
case Area.RightWall: |
|
|
|
{ |
|
|
|
{ |
|
|
|
newPos.x = FrozenScreenToWorldSpace.Instance.width / 2; |
|
|
|
float minmax = Mathf.Abs(padding - FrozenScreenToWorldSpace.Instance.length * 0.5f); |
|
|
|
q.SetLookRotation(Vector3.right); |
|
|
|
float shift = FrozenScreenToWorldSpace.Instance.Position.z; |
|
|
|
} |
|
|
|
float z = Mathf.Clamp(pos.z + noise, -minmax + shift, minmax + shift); |
|
|
|
if (area == Area.TopWall) |
|
|
|
transform.position = new Vector3(pos.x, pos.y, z); |
|
|
|
{ |
|
|
|
} |
|
|
|
newPos.z = FrozenScreenToWorldSpace.Instance.length / 2; |
|
|
|
break; |
|
|
|
q.SetLookRotation(Vector3.forward); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
transform.rotation = q; |
|
|
|
|
|
|
|
transform.position = newPos;// + FrozenScreenToWorldSpace.Instance.Position; |
|
|
|
|
|
|
|
RandomPos(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void RandomAppearWall() |
|
|
|
void RandomPos() |
|
|
|
{ |
|
|
|
|
|
|
|
Vector3 newPos = Vector3.zero; |
|
|
|
|
|
|
|
area = AppearArea[Random.Range(0, AppearArea.Count)]; |
|
|
|
|
|
|
|
Quaternion q = new Quaternion(); |
|
|
|
|
|
|
|
if (area == Area.LeftWall) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
newPos.x = -FrozenScreenToWorldSpace.Instance.width / 2; |
|
|
|
|
|
|
|
q.SetLookRotation(Vector3.left); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (area == Area.RightWall) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
newPos.x = FrozenScreenToWorldSpace.Instance.width / 2; |
|
|
|
float minX = renderers[(int)Status.TRIGGER].transform.localScale.x / 2; |
|
|
|
q.SetLookRotation(Vector3.right); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (area == Area.TopWall) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
newPos.z = FrozenScreenToWorldSpace.Instance.length / 2; |
|
|
|
|
|
|
|
q.SetLookRotation(Vector3.forward); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
transform.rotation = q; |
|
|
|
|
|
|
|
transform.position = newPos;// + FrozenScreenToWorldSpace.Instance.Position; |
|
|
|
|
|
|
|
RandomPos(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void RandomPos() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
float minX = renderers[(int)State.TRIGGER].transform.localScale.x / 2; |
|
|
|
|
|
|
|
#if true |
|
|
|
#if true |
|
|
|
switch (area) |
|
|
|
switch (area) |
|
|
|
{ |
|
|
|
{ |
|
|
|
case Area.TopWall: |
|
|
|
case Area.TopWall: |
|
|
|
wallRoi.x = Random.Range(minX, FrozenScreenToWorldSpace.Instance.width - minX) / FrozenScreenToWorldSpace.Instance.width; |
|
|
|
wallRoi.x = Random.Range(minX, FrozenScreenToWorldSpace.Instance.width - minX) / FrozenScreenToWorldSpace.Instance.width; |
|
|
|
break; |
|
|
|
break; |
|
|
|
case Area.LeftWall: |
|
|
|
case Area.LeftWall: |
|
|
|
case Area.RightWall: |
|
|
|
case Area.RightWall: |
|
|
|
wallRoi.x = Random.Range(minX, FrozenScreenToWorldSpace.Instance.length - minX) / FrozenScreenToWorldSpace.Instance.length; |
|
|
|
wallRoi.x = Random.Range(minX, FrozenScreenToWorldSpace.Instance.length - minX) / FrozenScreenToWorldSpace.Instance.length; |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
#else |
|
|
|
#else |
|
|
|
Vector3 randomPos = transform.localPosition; |
|
|
|
Vector3 randomPos = transform.localPosition; |
|
|
|
if (randomPos.x == 0) |
|
|
|
if (randomPos.x == 0) |
|
|
|
@ -408,27 +438,27 @@ public class CharacterBehaviour : MonoBehaviour |
|
|
|
else |
|
|
|
else |
|
|
|
wallRoi.x = Random.Range(minX, FrozenScreenToWorldSpace.Instance.length - minX) / FrozenScreenToWorldSpace.Instance.length; |
|
|
|
wallRoi.x = Random.Range(minX, FrozenScreenToWorldSpace.Instance.length - minX) / FrozenScreenToWorldSpace.Instance.length; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
wallRoi.y = origin_height / FrozenScreenToWorldSpace.Instance.height; |
|
|
|
wallRoi.y = origin_height / FrozenScreenToWorldSpace.Instance.height; |
|
|
|
UpdatePos(); |
|
|
|
UpdatePos(); |
|
|
|
UpdateButtonPos(); |
|
|
|
UpdateButtonPos(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void UpdatePos() |
|
|
|
void UpdatePos() |
|
|
|
{ |
|
|
|
|
|
|
|
#if true |
|
|
|
|
|
|
|
Vector3 n_pos = transform.position; |
|
|
|
|
|
|
|
switch (area) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
case Area.TopWall: |
|
|
|
#if true |
|
|
|
n_pos.x = Mathf.Lerp(-FrozenScreenToWorldSpace.Instance.width / 2, FrozenScreenToWorldSpace.Instance.width / 2, wallRoi.x); |
|
|
|
Vector3 n_pos = transform.position; |
|
|
|
break; |
|
|
|
switch (area) |
|
|
|
case Area.LeftWall: |
|
|
|
{ |
|
|
|
case Area.RightWall: |
|
|
|
case Area.TopWall: |
|
|
|
n_pos.z = Mathf.Lerp(-FrozenScreenToWorldSpace.Instance.length / 2, FrozenScreenToWorldSpace.Instance.length / 2, wallRoi.x); |
|
|
|
n_pos.x = Mathf.Lerp(-FrozenScreenToWorldSpace.Instance.width / 2, FrozenScreenToWorldSpace.Instance.width / 2, wallRoi.x); |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
case Area.LeftWall: |
|
|
|
n_pos.y = Mathf.Lerp(0.0f, FrozenScreenToWorldSpace.Instance.height, wallRoi.y); |
|
|
|
case Area.RightWall: |
|
|
|
transform.position = n_pos + FrozenScreenToWorldSpace.Instance.Position; |
|
|
|
n_pos.z = Mathf.Lerp(-FrozenScreenToWorldSpace.Instance.length / 2, FrozenScreenToWorldSpace.Instance.length / 2, wallRoi.x); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
n_pos.y = Mathf.Lerp(0.0f, FrozenScreenToWorldSpace.Instance.height, wallRoi.y); |
|
|
|
|
|
|
|
transform.position = n_pos + FrozenScreenToWorldSpace.Instance.Position; |
|
|
|
#else |
|
|
|
#else |
|
|
|
Vector3 n_pos = transform.localPosition; |
|
|
|
Vector3 n_pos = transform.localPosition; |
|
|
|
|
|
|
|
|
|
|
|
@ -439,38 +469,41 @@ public class CharacterBehaviour : MonoBehaviour |
|
|
|
n_pos.y = Mathf.Lerp(0, (float)FrozenScreenToWorldSpace.Instance.height, wallRoi.y); |
|
|
|
n_pos.y = Mathf.Lerp(0, (float)FrozenScreenToWorldSpace.Instance.height, wallRoi.y); |
|
|
|
transform.localPosition = n_pos; |
|
|
|
transform.localPosition = n_pos; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
//SetButtonPos(); |
|
|
|
//SetButtonPos(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void UpdateButtonPos() |
|
|
|
void UpdateButtonPos() |
|
|
|
{ |
|
|
|
{ |
|
|
|
//Vector2 newScreenPos = FrozenScreenToWorldSpace.Instance.GetFinalScreenPos(area, wallRoi); |
|
|
|
//Vector2 newScreenPos = FrozenScreenToWorldSpace.Instance.GetFinalScreenPos(area, wallRoi); |
|
|
|
var roi = FrozenScreenToWorldSpace.Instance.GetWallRoiFromPosition(area, renderers[(int)State.STANDBY].transform.position); |
|
|
|
var roi = FrozenScreenToWorldSpace.Instance.GetWallRoiFromPosition(area, renderers[(int)Status.STANDBY].transform.position); |
|
|
|
Vector2 newScreenPos = FrozenScreenToWorldSpace.Instance.GetFinalScreenPos(area, roi); |
|
|
|
Vector2 newScreenPos = FrozenScreenToWorldSpace.Instance.GetFinalScreenPos(area, roi); |
|
|
|
fakeButton.anchoredPosition = newScreenPos; |
|
|
|
fakeButton.anchoredPosition = newScreenPos; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void SetSpecificPos() |
|
|
|
void SetSpecificPos() |
|
|
|
{ |
|
|
|
{ |
|
|
|
int pos_index = Random.Range(0, specificPositions.Count); |
|
|
|
int pos_index = Random.Range(0, specificPositions.Count); |
|
|
|
var dummy = specificPositions[pos_index]; |
|
|
|
var dummy = specificPositions[pos_index]; |
|
|
|
area = dummy.area; |
|
|
|
area = dummy.area; |
|
|
|
transform.position = dummy.transform.position; |
|
|
|
transform.position = dummy.transform.position; |
|
|
|
transform.rotation = dummy.transform.rotation; |
|
|
|
transform.rotation = dummy.transform.rotation; |
|
|
|
UpdateWallRoiFromPosition(); |
|
|
|
UpdateWallRoiFromPosition(); |
|
|
|
UpdateButtonPos(); |
|
|
|
UpdateButtonPos(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void UpdateWallRoiFromPosition() |
|
|
|
void UpdateWallRoiFromPosition() |
|
|
|
{ |
|
|
|
{ |
|
|
|
wallRoi = FrozenScreenToWorldSpace.Instance.GetWallRoiFromPosition(area, transform.position); |
|
|
|
wallRoi = FrozenScreenToWorldSpace.Instance.GetWallRoiFromPosition(area, transform.position); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void Trigger(PointerEventData data) |
|
|
|
private void Trigger(PointerEventData data) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (state != State.STANDBY) |
|
|
|
if (status != Status.STANDBY) |
|
|
|
return; |
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
isTriggered = true; |
|
|
|
isTriggered = true; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|