Unity Project

reference
https://cardgames.io/yahtzee/
This commit is contained in:
mcutegs2
2020-07-21 15:43:56 +09:00
commit 42edc18e4e
4081 changed files with 189452 additions and 0 deletions

View 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;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4806f2cf660fb6d48ac4933167e21e7d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 6a51a5bfe16dbcf4eb363012be2f67a6
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant: