RESOURCES, FALL 2020:
IDM XR LAB WEBSITE:
CARLA TUTORIALS & SCRIPTS:
LIGHTING (Light Maps and Light Probe Groups)
POST PROCESSING, CHANGING SCENES, UI INTERACTIVITY, ANIMATION ON XR RIG, ANIMATED SHADERS
SNAP TURN SCRIPT WITH FADE (STEAM, can it be adapted for XR Toolkit?)
Copy using UnityEngine;
using System.Collections;
namespace Valve.VR.InteractionSystem
{
//-----------------------------------------------------------------------------
public class SnapTurn : MonoBehaviour
{
public float snapAngle = 90.0f;
public bool showTurnAnimation = true;
public AudioSource snapTurnSource;
public AudioClip rotateSound;
public GameObject rotateRightFX;
public GameObject rotateLeftFX;
public SteamVR_Action_Boolean snapLeftAction = SteamVR_Input.GetBooleanAction("SnapTurnLeft");
public SteamVR_Action_Boolean snapRightAction = SteamVR_Input.GetBooleanAction("SnapTurnRight");
public bool fadeScreen = true;
public float fadeTime = 0.1f;
public Color screenFadeColor = Color.black;
public float distanceFromFace = 1.3f;
public Vector3 additionalOffset = new Vector3(0, -0.3f, 0);
public static float teleportLastActiveTime;
private bool canRotate = true;
public float canTurnEverySeconds = 0.4f;
private void Start()
{
AllOff();
}
private void AllOff()
{
if (rotateLeftFX != null)
rotateLeftFX.SetActive(false);
if (rotateRightFX != null)
rotateRightFX.SetActive(false);
}
private void Update()
{
Player player = Player.instance;
if (canRotate && snapLeftAction != null && snapRightAction != null && snapLeftAction.activeBinding && snapRightAction.activeBinding)
{
//only allow snap turning after a quarter second after the last teleport
if (Time.time < (teleportLastActiveTime + canTurnEverySeconds))
return;
// only allow snap turning when not holding something
bool rightHandValid = player.rightHand.currentAttachedObject == null ||
(player.rightHand.currentAttachedObject != null
&& player.rightHand.currentAttachedTeleportManager != null
&& player.rightHand.currentAttachedTeleportManager.teleportAllowed);
bool leftHandValid = player.leftHand.currentAttachedObject == null ||
(player.leftHand.currentAttachedObject != null
&& player.leftHand.currentAttachedTeleportManager != null
&& player.leftHand.currentAttachedTeleportManager.teleportAllowed);
bool leftHandTurnLeft = snapLeftAction.GetStateDown(SteamVR_Input_Sources.LeftHand) && leftHandValid;
bool rightHandTurnLeft = snapLeftAction.GetStateDown(SteamVR_Input_Sources.RightHand) && rightHandValid;
bool leftHandTurnRight = snapRightAction.GetStateDown(SteamVR_Input_Sources.LeftHand) && leftHandValid;
bool rightHandTurnRight = snapRightAction.GetStateDown(SteamVR_Input_Sources.RightHand) && rightHandValid;
if (leftHandTurnLeft || rightHandTurnLeft)
{
RotatePlayer(-snapAngle);
}
else if (leftHandTurnRight || rightHandTurnRight)
{
RotatePlayer(snapAngle);
}
}
}
private Coroutine rotateCoroutine;
public void RotatePlayer(float angle)
{
if (rotateCoroutine != null)
{
StopCoroutine(rotateCoroutine);
AllOff();
}
rotateCoroutine = StartCoroutine(DoRotatePlayer(angle));
}
//-----------------------------------------------------
private IEnumerator DoRotatePlayer(float angle)
{
Player player = Player.instance;
canRotate = false;
snapTurnSource.panStereo = angle / 90;
snapTurnSource.PlayOneShot(rotateSound);
if (fadeScreen)
{
SteamVR_Fade.Start(Color.clear, 0);
Color tColor = screenFadeColor;
tColor = tColor.linear * 0.6f;
SteamVR_Fade.Start(tColor, fadeTime);
}
yield return new WaitForSeconds(fadeTime);
Vector3 playerFeetOffset = player.trackingOriginTransform.position - player.feetPositionGuess;
player.trackingOriginTransform.position -= playerFeetOffset;
player.transform.Rotate(Vector3.up, angle);
playerFeetOffset = Quaternion.Euler(0.0f, angle, 0.0f) * playerFeetOffset;
player.trackingOriginTransform.position += playerFeetOffset;
GameObject fx = angle > 0 ? rotateRightFX : rotateLeftFX;
if (showTurnAnimation)
ShowRotateFX(fx);
if (fadeScreen)
{
SteamVR_Fade.Start(Color.clear, fadeTime);
}
float startTime = Time.time;
float endTime = startTime + canTurnEverySeconds;
while (Time.time <= endTime)
{
yield return null;
UpdateOrientation(fx);
};
fx.SetActive(false);
canRotate = true;
}
void ShowRotateFX(GameObject fx)
{
if (fx == null)
return;
fx.SetActive(false);
UpdateOrientation(fx);
fx.SetActive(true);
UpdateOrientation(fx);
}
private void UpdateOrientation(GameObject fx)
{
Player player = Player.instance;
//position fx in front of face
this.transform.position = player.hmdTransform.position + (player.hmdTransform.forward * distanceFromFace);
this.transform.rotation = Quaternion.LookRotation(player.hmdTransform.position - this.transform.position, Vector3.up);
this.transform.Translate(additionalOffset, Space.Self);
this.transform.rotation = Quaternion.LookRotation(player.hmdTransform.position - this.transform.position, Vector3.up);
}
}
}
AUTHORING for Mozilla Hubs using - 53 minutes
Tutorial Videos:
(1) (12:42) - working in spoke
(2) (38:11) - working in spoke and playing in hubs
(3) (02:00) - teleporting/leaving hubs
INTRO TO UNITY (demo) Basic Setup, Packages, Asset store
(1) (01:08) installing the editor to your computer
(2) (11:17) getting to know the UI
(3) (08:46) still getting to know the UI
(4) (06:21) creating/assigning materials to objects
(5) (17:21) game mode/adding simple physics to the objects/asset store/package manager/exporting as a package
BUILD SETTINGS with Oculus Quest
UNITY QUEST FUN (full tutorial to be posted here soon)
ADDITIONAL TUTORIALS/RESOURCES
SPECIFIC FUNCTIONALITY TUTORIALS
GREAT YOU TUBE CHANNELS TO FOLLOW:
ARCHIVE OF RESOURCES, FALL 2019:
Week 09
Optimizing Unity Files
Shaders in Unity with Amplify
Create Dynamic Materials Without the Need for Code
Week 08
There's a few different thoughts on getting Processing to work inside Unity.
Particle Systems in Unibyt
Rendering 360 Images in Maya
Week 07
Week 05
Week 04
Week 03