Skip to content

Instantly share code, notes, and snippets.

@runewake2
Created May 24, 2017 04:40
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save runewake2/e3d04d1faf6c50c11ece63c776a2840c to your computer and use it in GitHub Desktop.
Save runewake2/e3d04d1faf6c50c11ece63c776a2840c to your computer and use it in GitHub Desktop.
Dice Roller used to determine which side of a dice has been rolled. Generic implementation capable of working for any number of sided object.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// Written as part of World of Zero
// Video available here: https://youtu.be/hmDF9PvMDVw
public class Dice : MonoBehaviour
{
public SideResults selectedResult;
public int selectedVector;
// Note: the size of the vectorValues and vectorPoints should be the same.
public SideResults[] vectorValues;
public Vector3[] vectorPoints; // These vectors should be normalized. Might be worth adding a task to Start to ensure they are normalized.
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update ()
{
float bestDot = -1;
for(int i = 0; i < vectorPoints.Length; ++i)
{
var valueVector = vectorPoints[i];
// Each side vector is in local object space. We need them in world space for our calculation.
var worldSpaceValueVector = this.transform.localToWorldMatrix.MultiplyVector(valueVector);
// Mathf.Arccos of the dot product can be used to get the angle of difference. You can use this to check for a tilt (perhaps requiring a reroll)
float dot = Vector3.Dot(worldSpaceValueVector, Vector3.up);
if (dot > bestDot)
{
// The vector with the greatest dot product is the vector in the most "up" direction. This is the current face selected.
bestDot = dot;
selectedVector = i;
}
}
selectedResult = vectorValues[selectedVector];
}
void OnDrawGizmos()
{
Gizmos.color = Color.red;
foreach (var valueVector in vectorPoints)
{
var worldSpaceValueVector = this.transform.localToWorldMatrix.MultiplyVector(valueVector);
Gizmos.DrawLine(this.transform.position, this.transform.position + worldSpaceValueVector);
}
}
}
// Enum for storing the potential results.
public enum SideResults
{
Red,
Green,
White,
Black,
Yellow,
Purple
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment