Code - ImmersiveStorytelling/DocumentationMasterclass GitHub Wiki
This is the code we used for telling the Black Room story. Divided pieces of code you can find on the other Wiki pages:
For refactored code, click here!
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//public enum eulerAngEnum
//{
// front,
// right,
// back,
// left,
// none
//};
public class startUp : MonoBehaviour {
private GameObject obj;
private int[] eulerAngArr = { 170, 260, 350, 80 };
private int[] endOfFilm = { 4000, 0, 0, 55000 };
public int cacheAmount;
private int step = 0;
private int numberOfShots;
//private bool step1Finished = false;
private bool charlotteSeen = false;
private bool step4Finished = false;
private bool step5Finished = false;
private bool step6Finished = false;
private bool step7Finished = false;
private bool lastStepStarted = false;
private double yAngle = 0;
private eulerAngEnum[] switchAngles = {
eulerAngEnum.none,
eulerAngEnum.front,
eulerAngEnum.front,
eulerAngEnum.front, //upsidedown
eulerAngEnum.none, //timer donker
eulerAngEnum.back, //upsidedown
eulerAngEnum.none, //front
eulerAngEnum.front //timer donker
};
void Start () {
numberOfShots = switchAngles.Length + 1;
makeSpheres();
}
void Update () {
yAngle = GameObject.Find("Camera (eye)").transform.rotation.eulerAngles.y;
if (GameObject.Find("[CameraRig]").GetComponent<HPV_Manager>().getPositionMs(0) == 8000)
{
if ((step + cacheAmount) < numberOfShots)
{
GameObject.Find("Steps").transform.GetChild(step + cacheAmount).gameObject.SetActive(true);
}
if (step < (numberOfShots - 1))
{
GameObject.Find("Steps").transform.GetChild(step).gameObject.SetActive(false);
if (step < numberOfShots - 2)
{
step++;
setFilm((byte)step, 0, true);
}
}
}
/*if (GameObject.Find("[CameraRig]").GetComponent<HPV_Manager>().getPositionMs(0) >= 17240) //reverse video
{
step1Finished = true;
}*/
if (GameObject.Find("[CameraRig]").GetComponent<HPV_Manager>().getPositionMs(3) >= 45000)
{
step4Finished = true;
}
if (GameObject.Find("[CameraRig]").GetComponent<HPV_Manager>().getPositionMs(4) >= 100000)
{
if ((step + cacheAmount) < numberOfShots)
{
GameObject.Find("Steps").transform.GetChild(step + cacheAmount).gameObject.SetActive(true);
}
if (step < (numberOfShots - 1))
{
GameObject.Find("Steps").transform.GetChild(step).gameObject.SetActive(false);
if (step < numberOfShots - 2)
{
step++;
setFilm((byte)step, 5000, true);
}
}
}
if (GameObject.Find("[CameraRig]").GetComponent<HPV_Manager>().getPositionMs(5) >= 65000)
{
step5Finished = true;
}
if (GameObject.Find("[CameraRig]").GetComponent<HPV_Manager>().getPositionMs(6) >= 107000)
{
step6Finished = true;
}
if (GameObject.Find("[CameraRig]").GetComponent<HPV_Manager>().getPositionMs(7) >= 50000)
{
if (!GameObject.Find("Steps").transform.GetChild(6).gameObject.activeSelf)
{
step7Finished = true;
}
}
if (step == 2)
{
if (yAngle > (eulerAngArr[2] - 10) && yAngle < (eulerAngArr[2] + 10))
{
charlotteSeen = true;
}
}
if (switchAngles[step] != eulerAngEnum.none)
{
Debug.Log(GameObject.Find("[CameraRig]").GetComponent<HPV_Manager>().getPositionMs(1));
/*if (step == 0)
{
if (step1Finished)
{
step++;
setFilm((byte)step, 0, true);
}
}
else */if(step == 2)
{
if(charlotteSeen)
{
checkAngles();
setFilm(3, 18000, true);
}
}
else if(step == 3)
{
if(step4Finished)
{
checkAngles();
}
}
else if(step == 5)
{
if (step5Finished)
{
checkAngles();
}
}
else if (step == 6)
{
if (step6Finished)
{
//checkAngles();
step++;
setFilm((byte)step, 0, true);
}
}
else if(step == 7)
{
if (step7Finished)
{
checkAngles();
}
}
else
{
checkAngles();
}
}
//set begin point of films
if(GameObject.Find("[CameraRig]").GetComponent<HPV_Manager>().getPositionMs((byte)step) == 0)
{
switch(step)
{
case 0: setFilm((byte)step, 101640, false); break;
case 3: setFilm((byte)step, 18000, true); break;
case 4: setFilm((byte)step, 18000, true); break;
}
}
}
private void makeSpheres()
{
for (int i = 1; i < numberOfShots + 1; i++)
{
obj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
obj.name = "shot" + i;
obj.transform.localScale = new Vector3(100, 100, 100);
obj.AddComponent<HPV_Node>();
obj.GetComponent<HPV_Node>().filename = i + ".hpv";
if (i == 5)
{
obj.transform.Rotate(new Vector3(180, 180, 0));
}
if (i == 7)
{
obj.transform.Rotate(new Vector3(180, 0, 0));
}
Renderer myRenderer = obj.GetComponent<MeshRenderer>();
myRenderer.material.shader = Shader.Find("Custom/HPV/Spherical");
if (i > 1)
{
if (i > 3)
obj.SetActive(false);
}
obj.transform.parent = GameObject.Find("Steps").transform;
}
}
private void checkAngles()
{
if (yAngle > (eulerAngArr[(int)switchAngles[step]] - 10) && yAngle < (eulerAngArr[(int)switchAngles[step]] + 10))
{
if ((step + cacheAmount) < numberOfShots)
GameObject.Find("Steps").transform.GetChild(step + cacheAmount).gameObject.SetActive(true);
//if (step < (numberOfShots - 1))
//{
GameObject.Find("Steps").transform.GetChild(step).gameObject.SetActive(false);
if (step < numberOfShots - 2)
{
step++;
setFilm((byte)step, 0, true);
}
else if (!lastStepStarted)
{
lastStepStarted = true;
setFilm((byte)(step+1), 0, true);
}
//}
}
}
private void setFilm(byte node, int startPos, bool direction)
{
GameObject g = GameObject.Find("[CameraRig]");
g.GetComponent<HPV_Manager>().seekToMs(node, startPos);
g.GetComponent<HPV_Manager>().setDirection(node, direction);
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
public enum SwitchType
{
angle,
time,
both
}
public enum eulerAngEnum
{
front,
right,
back,
left,
none
};
public class jsonTestScript : MonoBehaviour
{
public int[] eulerAngArr = { 170, 260, 350, 80 };
[Serializable]
public class Shot
{
public string Filename;
public SwitchType Switch;
public bool Reverse;
public int Startpoint;
public eulerAngEnum[] SwitchAngles;
public int SwitchTime;
public int[] Orientation;
}
public List<Shot> ShotList;
private int cacheAmount = 2;
private bool lastStepStarted = false;
private int numberOfShots;
private HPV_Manager manager;
private int step = 0;
private bool shotStarted = false;
private int anglesHit = 0;
// Use this for initialization
void Start()
{
manager = GameObject.Find("[CameraRig]").GetComponent<HPV_Manager>();
makeSpheres(ShotList);
numberOfShots = ShotList.Count;
}
// Update is called once per frame
void Update()
{
bool shotReady = false;
Shot currentShot = ShotList[step];
if (!shotStarted)
{
shotStarted = true;
manager.resumeVideo((byte)step);
setFilm((byte)step, currentShot.Startpoint, !currentShot.Reverse);
}
switch (currentShot.Switch)
{
case SwitchType.angle:
shotReady = checkAngles(currentShot);
break;
case SwitchType.time:
shotReady = checkTime(currentShot);
break;
case SwitchType.both:
if (checkTime(currentShot))
{
shotReady = checkAngles(currentShot);
}
break;
default:
break;
}
if (shotReady)
{
if ((step + cacheAmount) < numberOfShots)
GameObject.Find("Steps").transform.GetChild(step + cacheAmount).gameObject.SetActive(true);
GameObject.Find("Steps").transform.GetChild(step).gameObject.SetActive(false);
shotStarted = false;
if (step < numberOfShots - 2)
{
manager.pauseVideo((byte)step);
step++;
}
else if (!lastStepStarted)
{
lastStepStarted = true;
}
}
}
private bool checkTime(Shot shot)
{
if (step ==6)
{
Debug.Log(manager.getPositionMs((byte)step));
}
if (shot.Reverse)
{
if (manager.getPositionMs((byte)step)<=shot.SwitchTime)
{
manager.pauseVideo((byte)step);
return true;
}
}
else
{
if (manager.getPositionMs((byte)step) >= shot.SwitchTime)
{
manager.pauseVideo((byte)step);
return true;
}
}
return false;
}
private bool checkAngles(Shot shot)
{
float yAngle = GameObject.Find("Camera (eye)").transform.rotation.eulerAngles.y;
eulerAngEnum[] toHitAngles = shot.SwitchAngles;
if ((yAngle > (eulerAngArr[(int)toHitAngles[anglesHit]] - 10) && yAngle < (eulerAngArr[(int)toHitAngles[anglesHit]] + 10)))
{
anglesHit++;
}
if (anglesHit >= toHitAngles.Length)
{
anglesHit = 0;
return true;
}
else
{
return false;
}
}
private void makeSpheres(List<Shot> shotList)
{
for (int i = 0; i < shotList.Count; i++)
{
GameObject obj;
obj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
obj.name = "shot" + i;
obj.transform.localScale = new Vector3(100, 100, 100);
obj.AddComponent<HPV_Node>();
obj.GetComponent<HPV_Node>().filename = shotList[i].Filename;
manager.setLoopState((byte)step, 0);
manager.pauseVideo((byte)i);
manager.setSpeed((byte)i, 1.1988);
if (shotList[i].Orientation.Length == 3)
{
obj.transform.Rotate(new Vector3(shotList[i].Orientation[0], shotList[i].Orientation[1], shotList[i].Orientation[2]));
}
Renderer myRenderer = obj.GetComponent<MeshRenderer>();
myRenderer.material.shader = Shader.Find("Custom/HPV/Spherical");
if (i > 1)
{
if (i > 1)
obj.SetActive(false);
}
obj.transform.parent = GameObject.Find("Steps").transform;
}
}
private void setFilm(byte node, int startPos, bool direction)
{
GameObject g = GameObject.Find("[CameraRig]");
g.GetComponent<HPV_Manager>().seekToMs(node, startPos);
g.GetComponent<HPV_Manager>().setDirection(node, direction);
}
}