469
Assets/Dice/scenes/Demo/AppDemo.cs
Normal file
469
Assets/Dice/scenes/Demo/AppDemo.cs
Normal file
@@ -0,0 +1,469 @@
|
||||
/**
|
||||
* Copyright (c) 2010-2015, WyrmTale Games and Game Components
|
||||
* All rights reserved.
|
||||
* http://www.wyrmtale.com
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY WYRMTALE GAMES AND GAME COMPONENTS 'AS IS' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL WYRMTALE GAMES AND GAME COMPONENTS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
|
||||
// Demo application script
|
||||
public class AppDemo : MonoBehaviour {
|
||||
|
||||
// constant of current demo mode
|
||||
private const int MODE_GALLERY = 1;
|
||||
private const int MODE_ROLL = 2;
|
||||
// current demo mode
|
||||
private int mode = 0;
|
||||
|
||||
// next camera position when moving the camera after switching mode
|
||||
private GameObject nextCameraPosition = null;
|
||||
// start camera position when moving the camera after switching mode
|
||||
private GameObject startCameraPosition = null;
|
||||
// store gameObject (empty) for mode MODE_ROLL camera position
|
||||
private GameObject camRoll = null;
|
||||
// store gameObject (empty) for mode MODE_GALLERY camera position
|
||||
private GameObject camGallery = null;
|
||||
// speed of moving camera after switching mode
|
||||
private float cameraMovementSpeed = 0.8F;
|
||||
private float cameraMovement = 0;
|
||||
|
||||
// initial/starting die in the gallery
|
||||
private string galleryDie = "d6-red";
|
||||
private GameObject galleryDieObject = null;
|
||||
|
||||
// handle drag rotating the die in the gallery
|
||||
private bool dragging = false;
|
||||
private Vector2 dragStart;
|
||||
private Vector3 dragStartAngle;
|
||||
private Vector3 dragLastAngle;
|
||||
|
||||
// rectangle GUI area's
|
||||
private Rect rectGallerySelectBox;
|
||||
private Rect rectGallerySelect;
|
||||
private Rect rectModeSelect;
|
||||
|
||||
// GUI gallery die selector texture
|
||||
private Texture txSelector = null;
|
||||
|
||||
// Use this for initialization
|
||||
void Start () {
|
||||
// store/cache mode assiociated camera positions
|
||||
camRoll = GameObject.Find("cameraPositionRoll");
|
||||
camGallery = GameObject.Find("cameraPositionGallery");
|
||||
// set GUI rectangles of the (screen related) gallery selector
|
||||
rectGallerySelectBox = new Rect(Screen.width - 260, 10, 250, 170);
|
||||
rectGallerySelect = new Rect(Screen.width-250,35,219,109);
|
||||
rectModeSelect = new Rect(10,10,180,80);
|
||||
// set (first) mode to gallery
|
||||
SetMode(MODE_GALLERY);
|
||||
|
||||
}
|
||||
|
||||
private void SetMode(int pMode)
|
||||
{
|
||||
// camera is already moving - mode switching - no new mode will be set and we exit here
|
||||
if (nextCameraPosition != null || pMode == mode) return;
|
||||
|
||||
switch(pMode)
|
||||
{
|
||||
case MODE_GALLERY:
|
||||
// switch to gallery mode
|
||||
startCameraPosition = camRoll;
|
||||
nextCameraPosition = camGallery;
|
||||
// create die that will be displayed in the gallery
|
||||
SetGalleryDie(galleryDie);
|
||||
break;
|
||||
case MODE_ROLL:
|
||||
// switch to rolling mode
|
||||
startCameraPosition = camGallery;
|
||||
nextCameraPosition = camRoll;
|
||||
break;
|
||||
}
|
||||
|
||||
if (nextCameraPosition!=null && mode==0)
|
||||
{
|
||||
// first time we set mode, so we do not move camera but set it at the right position
|
||||
Camera.main.transform.position = nextCameraPosition.transform.position;
|
||||
Camera.main.transform.rotation = nextCameraPosition.transform.rotation;
|
||||
// next camera position to null so camera will not start moving ( nextCameraPosition is camera moving indicator variable )
|
||||
nextCameraPosition = null;
|
||||
}
|
||||
|
||||
mode = pMode;
|
||||
cameraMovement = 0;
|
||||
}
|
||||
|
||||
// determine a random color
|
||||
string randomColor
|
||||
{
|
||||
get
|
||||
{
|
||||
string _color = "blue";
|
||||
int c = System.Convert.ToInt32(Random.value * 6);
|
||||
switch(c)
|
||||
{
|
||||
case 0: _color = "red"; break;
|
||||
case 1: _color = "green"; break;
|
||||
case 2: _color = "blue"; break;
|
||||
case 3: _color = "yellow"; break;
|
||||
case 4: _color = "white"; break;
|
||||
case 5: _color = "black"; break;
|
||||
}
|
||||
return _color;
|
||||
}
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update () {
|
||||
|
||||
// if next camera position is set we are , or have to start moving the camera.
|
||||
if (nextCameraPosition!=null)
|
||||
MoveCamera();
|
||||
|
||||
switch(mode)
|
||||
{
|
||||
case MODE_GALLERY:
|
||||
// gallery mode to update the gallery
|
||||
UpdateGallery();
|
||||
break;
|
||||
case MODE_ROLL:
|
||||
// rolling mode to update the dice rolling
|
||||
UpdateRoll();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Moving the camera
|
||||
void MoveCamera()
|
||||
{
|
||||
// increment total moving time
|
||||
cameraMovement += Time.deltaTime * 1;
|
||||
// if we surpass the speed we have to cap the movement because we are 'slerping'
|
||||
if (cameraMovement>cameraMovementSpeed)
|
||||
cameraMovement = cameraMovementSpeed;
|
||||
|
||||
// slerp (circular interpolation) the position between start and next camera position
|
||||
Camera.main.transform.position = Vector3.Slerp(startCameraPosition.transform.position, nextCameraPosition.transform.position, cameraMovement / cameraMovementSpeed );
|
||||
// slerp (circular interpolation) the rotation between start and next camera rotation
|
||||
Camera.main.transform.rotation = Quaternion.Slerp(startCameraPosition.transform.rotation, nextCameraPosition.transform.rotation, cameraMovement / cameraMovementSpeed );
|
||||
|
||||
// stop moving if we arrived at the desired next camera postion
|
||||
if (cameraMovement == cameraMovementSpeed)
|
||||
nextCameraPosition = null;
|
||||
}
|
||||
|
||||
// updating the gallery
|
||||
void UpdateGallery()
|
||||
{
|
||||
if (!PointInRect(GuiMousePosition(), rectModeSelect) && !PointInRect(GuiMousePosition(), rectGallerySelectBox ))
|
||||
{
|
||||
// mouse position is not on GUI mode selector or gallery selector
|
||||
if (Input.GetMouseButton(Dice.MOUSE_LEFT_BUTTON))
|
||||
{
|
||||
// mouse left button is held down
|
||||
if (!dragging)
|
||||
{
|
||||
// start dragging
|
||||
dragging = true;
|
||||
// remember where (mouse coords) we started to drag and what the start angle of the die was
|
||||
dragStart = Input.mousePosition;
|
||||
dragStartAngle = galleryDieObject.transform.eulerAngles;
|
||||
// stop the gallery die rotation
|
||||
galleryDieObject.GetComponent<Rigidbody>().angularVelocity = Vector3.zero;
|
||||
}
|
||||
else
|
||||
{
|
||||
// we are dragging
|
||||
Vector2 delta = Input.mousePosition;
|
||||
// calculate delta vector of the mouse position related to our drag start point
|
||||
delta -= dragStart;
|
||||
// normalize this vector so we can use it to determine the desired rotation angle
|
||||
Vector2 dn = delta.normalized;
|
||||
// initialize the rotation of gallery die to its starting point
|
||||
galleryDieObject.transform.eulerAngles = dragStartAngle;
|
||||
// if we move the mouse horizontal we want to rotate around the Y axis (Vector3.up -> normalized vector)
|
||||
Vector3 mouseXRotationVector = Vector3.up;
|
||||
// if we move the mouse vertical we want to rotate towards the camera. we calculate this normalized rotation
|
||||
// vector by using the vector from the camera to the gallery die and rotating it 45 degrees around the Y-axis
|
||||
Vector3 mouseYRotationVector = Vector3.Lerp(camGallery.transform.position, galleryDieObject.transform.position, 1).normalized;
|
||||
mouseYRotationVector = Quaternion.Euler(0, 45, 0) * mouseYRotationVector;
|
||||
// we only want to rotate around the X and Z axis when moving the mouse vertical so we set y-axis to 0
|
||||
mouseYRotationVector.y = 0;
|
||||
// calculate the right rotation angle and rotate the die around its position using the mouse position delta vector
|
||||
Vector3 angle = (mouseYRotationVector * dn.y) + (mouseXRotationVector * dn.x * -1);
|
||||
galleryDieObject.transform.RotateAround(galleryDieObject.transform.position, angle, delta.magnitude * .6F);
|
||||
// store this angle as the 'last' angle so we can determine the right rotation when we release
|
||||
// the mouse button and stop dragging
|
||||
dragLastAngle = angle;
|
||||
}
|
||||
}
|
||||
else
|
||||
if (Input.GetMouseButtonUp(Dice.MOUSE_LEFT_BUTTON) && dragging)
|
||||
{
|
||||
// left mouse button was released while we were dragging
|
||||
float force = .4F;
|
||||
dragging = false;
|
||||
// add correct torque to spin the gallery die
|
||||
galleryDieObject.GetComponent<Rigidbody>().AddTorque(dragLastAngle.normalized * force, ForceMode.Impulse);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// dertermine random rolling force
|
||||
private GameObject spawnPoint = null;
|
||||
private Vector3 Force()
|
||||
{
|
||||
Vector3 rollTarget = Vector3.zero + new Vector3(2 + 7 * Random.value, .5F + 4 * Random.value, -2 - 3 * Random.value);
|
||||
return Vector3.Lerp(spawnPoint.transform.position, rollTarget, 1).normalized * (-35 - Random.value * 20);
|
||||
}
|
||||
|
||||
void UpdateRoll()
|
||||
{
|
||||
spawnPoint = GameObject.Find("spawnPoint");
|
||||
// check if we have to roll dice
|
||||
if (Input.GetMouseButtonDown(Dice.MOUSE_LEFT_BUTTON) && !PointInRect(GuiMousePosition(), rectModeSelect))
|
||||
{
|
||||
// left mouse button clicked so roll random colored dice 2 of each dieType
|
||||
Dice.Clear();
|
||||
|
||||
Dice.Roll("1d10", "d10-" + randomColor, spawnPoint.transform.position, Force());
|
||||
Dice.Roll("1d10", "d10-" + randomColor, spawnPoint.transform.position, Force());
|
||||
Dice.Roll("1d10", "d10-" + randomColor, spawnPoint.transform.position, Force());
|
||||
Dice.Roll("1d10", "d10-" + randomColor, spawnPoint.transform.position, Force());
|
||||
Dice.Roll("1d6", "d6-" + randomColor, spawnPoint.transform.position, Force());
|
||||
Dice.Roll("1d6", "d6-" + randomColor, spawnPoint.transform.position, Force());
|
||||
Dice.Roll("1d6", "d6-" + randomColor, spawnPoint.transform.position, Force());
|
||||
Dice.Roll("1d6", "d6-" + randomColor, spawnPoint.transform.position, Force());
|
||||
}
|
||||
else
|
||||
if (Input.GetMouseButtonDown(Dice.MOUSE_RIGHT_BUTTON) && !PointInRect(GuiMousePosition(), rectModeSelect))
|
||||
{
|
||||
// right mouse button clicked so roll 8 dice of dieType 'gallery die'
|
||||
Dice.Clear();
|
||||
string[] a = galleryDie.Split('-');
|
||||
Dice.Roll("8" + a[0], galleryDie, spawnPoint.transform.position, Force());
|
||||
}
|
||||
}
|
||||
|
||||
// handle GUI
|
||||
void OnGUI()
|
||||
{
|
||||
// Make mode selection box
|
||||
GUI.Box (rectModeSelect, "Dice Demo");
|
||||
if (GUI.Button (new Rect (20,35,160,20), "Dice Gallery")) {
|
||||
SetMode(MODE_GALLERY);
|
||||
}
|
||||
if (GUI.Button (new Rect (20,60,160,20), "Roll Dice")) {
|
||||
SetMode(MODE_ROLL);
|
||||
}
|
||||
|
||||
switch(mode)
|
||||
{
|
||||
case MODE_GALLERY:
|
||||
if (nextCameraPosition==null)
|
||||
{
|
||||
// camera is not moving so display dice selector
|
||||
GUI.Box (rectGallerySelectBox, "Dice Selector");
|
||||
if (txSelector == null)
|
||||
{
|
||||
// determine dieType dependent selection texture
|
||||
string add = "";
|
||||
if (galleryDie.IndexOf("-dots") >= 0)
|
||||
// dice with dots found so we have to append -dots when loading material
|
||||
add = "-dots";
|
||||
// we have to load our selector texture
|
||||
txSelector = (Texture)Resources.Load("Textures/GUI-selector/select-" + galleryDie.Split('-')[0]+add);
|
||||
}
|
||||
|
||||
if (txSelector != null)
|
||||
{
|
||||
// draw our selector texture
|
||||
GUI.DrawTexture(rectGallerySelect, txSelector , ScaleMode.ScaleToFit, true, 0f);
|
||||
}
|
||||
|
||||
// check current mouseposition against selector
|
||||
string status = CheckSelection(rectGallerySelect);
|
||||
if (status == "") status = "[select your dice and color]";
|
||||
|
||||
// display status label
|
||||
GUI.Label (new Rect (Screen.width-245, 145, 230, 20), status);
|
||||
}
|
||||
GUI.Box(new Rect((Screen.width - 350) / 2, Screen.height - 40, 350, 25), "");
|
||||
GUI.Label(new Rect(((Screen.width - 350) / 2) + 10, Screen.height - 38, 350, 22), "You can rotate the die by dragging it with the mouse.");
|
||||
break;
|
||||
case MODE_ROLL:
|
||||
// display rolling message on bottom
|
||||
GUI.Box(new Rect((Screen.width-520)/2, Screen.height-40, 520, 25), "");
|
||||
GUI.Label(new Rect(((Screen.width - 520) / 2)+10, Screen.height - 38, 520, 22), "Click with the left (all die types) or right (gallery die) mouse button in the center to roll.");
|
||||
if (Dice.Count("")>0)
|
||||
{
|
||||
// we have rolling dice so display rolling status
|
||||
GUI.Box(new Rect( 10 , Screen.height - 75 , Screen.width - 20 , 30), "");
|
||||
GUI.Label(new Rect(20, Screen.height - 70, Screen.width, 20), Dice.AsString(""));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// check if a point is within a rectangle
|
||||
private bool PointInRect(Vector2 p, Rect r)
|
||||
{
|
||||
return (p.x>=r.xMin && p.x<=r.xMax && p.y>=r.yMin && p.y<=r.yMax);
|
||||
}
|
||||
|
||||
private string CheckSelection(Rect r)
|
||||
{
|
||||
string status = "";
|
||||
// mlb is true when left mouse button is clicked
|
||||
bool mlb = Input.GetMouseButtonDown(Dice.MOUSE_LEFT_BUTTON);
|
||||
// determine current GUI mouse position
|
||||
Vector2 mp = GuiMousePosition();
|
||||
// check current GUI mouse position
|
||||
if (PointInRect(mp, new Rect(r.xMin + 12, r.yMin + 9, 200, 46)))
|
||||
{
|
||||
// we are in dice type selection so determine what dieType we are over
|
||||
// set the die if mouse button is clicked
|
||||
txSelector = null;
|
||||
if (mp.x - r.xMin < 45)
|
||||
{
|
||||
status = "d4 - not available in Dices - Light";
|
||||
}
|
||||
else
|
||||
if (mp.x - r.xMin < 75)
|
||||
{
|
||||
if (mp.y - r.yMin < 30)
|
||||
{
|
||||
if (mlb) SetGalleryDie("d6-" + galleryDie.Split('-')[1] + "-dots");
|
||||
status = "d6 dotted";
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mlb) SetGalleryDie("d6-" + galleryDie.Split('-')[1]);
|
||||
status = "d6";
|
||||
}
|
||||
}
|
||||
else
|
||||
if (mp.x - r.xMin < 115)
|
||||
{
|
||||
status = "d8 - not available in Dices - Light";
|
||||
}
|
||||
else
|
||||
if (mp.x - r.xMin < 147)
|
||||
{
|
||||
if (mlb) SetGalleryDie("d10-" + galleryDie.Split('-')[1]);
|
||||
status = "d10";
|
||||
}
|
||||
else
|
||||
if (mp.x - r.xMin < 180)
|
||||
{
|
||||
status = "d12 - not available in Dices - Light";
|
||||
}
|
||||
else
|
||||
{
|
||||
status = "d20 - not available in Dices - Light";
|
||||
}
|
||||
}
|
||||
else
|
||||
if (PointInRect(mp, new Rect(r.xMin+ 12, r.yMin + 70, 200, 28)))
|
||||
{
|
||||
// we are in dice color selection so set active color if mouse button was clicked
|
||||
|
||||
// check if we had a d6 with dots
|
||||
string add = "";
|
||||
if (galleryDie.IndexOf("-dots") >= 0)
|
||||
// dice with dots found so we have to append -dots when loading material
|
||||
add = "-dots";
|
||||
|
||||
if (mp.x - r.xMin < 45)
|
||||
{
|
||||
if (mlb) SetGalleryDie(galleryDie.Split('-')[0] + "-red" + add);
|
||||
status = "red";
|
||||
}
|
||||
else
|
||||
if (mp.x - r.xMin < 75)
|
||||
{
|
||||
if (mlb) SetGalleryDie(galleryDie.Split('-')[0] + "-black" + add);
|
||||
status = "black";
|
||||
}
|
||||
else
|
||||
if (mp.x - r.xMin < 115)
|
||||
{
|
||||
if (mlb) SetGalleryDie(galleryDie.Split('-')[0] + "-white" + add);
|
||||
status = "white";
|
||||
}
|
||||
else
|
||||
if (mp.x - r.xMin < 147)
|
||||
{
|
||||
if (mlb) SetGalleryDie(galleryDie.Split('-')[0] + "-yellow" + add);
|
||||
status = "yellow";
|
||||
}
|
||||
else
|
||||
if (mp.x - r.xMin < 180)
|
||||
{
|
||||
if (mlb) SetGalleryDie(galleryDie.Split('-')[0] + "-green" + add);
|
||||
status = "green";
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mlb) SetGalleryDie(galleryDie.Split('-')[0] + "-blue" + add);
|
||||
status = "blue";
|
||||
}
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
// translate Input mouseposition to GUI coordinates using camera viewport
|
||||
private Vector2 GuiMousePosition()
|
||||
{
|
||||
Vector2 mp = Input.mousePosition;
|
||||
Vector3 vp = Camera.main.ScreenToViewportPoint (new Vector3(mp.x,mp.y,0));
|
||||
mp = new Vector2(vp.x * Camera.main.pixelWidth, (1-vp.y) * Camera.main.pixelHeight);
|
||||
return mp;
|
||||
}
|
||||
|
||||
// set spcific gallery die type
|
||||
void SetGalleryDie(string die)
|
||||
{
|
||||
Vector3 newRotation = new Vector3(-90, -65, 0);
|
||||
Vector4 angleVelocity = Vector3.zero;
|
||||
// destroy current gallery die if we have one
|
||||
if (galleryDie != "" && galleryDieObject != null)
|
||||
{
|
||||
// save rotation and angle velocity so we can set it on the new die later
|
||||
newRotation = galleryDieObject.transform.eulerAngles;
|
||||
angleVelocity = galleryDieObject.GetComponent<Rigidbody>().angularVelocity;
|
||||
galleryDieObject.active = false;
|
||||
// destroy die gameObject
|
||||
GameObject.Destroy(galleryDieObject);
|
||||
}
|
||||
galleryDie = die;
|
||||
string[] a = galleryDie.Split('-');
|
||||
GameObject g = GameObject.Find("platform-2");
|
||||
if (g!=null)
|
||||
{
|
||||
// create the new die
|
||||
galleryDieObject = Dice.prefab(a[0], g.transform.position + new Vector3(0, 3.8F, 0), newRotation , new Vector3(1.4f,1.4f,1.4f),die);
|
||||
// disable rigidBody gravity
|
||||
galleryDieObject.GetComponent<Rigidbody>().useGravity = false;
|
||||
// add saved angle and angle velocity or torque impulse
|
||||
if (angleVelocity.x == 0 && angleVelocity.y == 0 && angleVelocity.z==0)
|
||||
galleryDieObject.GetComponent<Rigidbody>().AddTorque(new Vector3(0, -.4F, 0), ForceMode.Impulse);
|
||||
else
|
||||
galleryDieObject.GetComponent<Rigidbody>().angularVelocity = angleVelocity;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
11
Assets/Dice/scenes/Demo/AppDemo.cs.meta
Normal file
11
Assets/Dice/scenes/Demo/AppDemo.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4806f2cf660fb6d48ac4933167e21e7d
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
1707
Assets/Dice/scenes/Demo/demo.unity
Normal file
1707
Assets/Dice/scenes/Demo/demo.unity
Normal file
File diff suppressed because it is too large
Load Diff
7
Assets/Dice/scenes/Demo/demo.unity.meta
Normal file
7
Assets/Dice/scenes/Demo/demo.unity.meta
Normal file
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6a51a5bfe16dbcf4eb363012be2f67a6
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user