|
|
//======= Copyright (c) Valve Corporation, All rights reserved. ===============
|
|
|
//
|
|
|
// Purpose: BALLOONS!!
|
|
|
//
|
|
|
//=============================================================================
|
|
|
|
|
|
using UnityEngine;
|
|
|
using System.Collections;
|
|
|
|
|
|
namespace Valve.VR.InteractionSystem
|
|
|
{
|
|
|
//-------------------------------------------------------------------------
|
|
|
public class Balloon : MonoBehaviour
|
|
|
{
|
|
|
public enum BalloonColor { Red, OrangeRed, Orange, YellowOrange, Yellow, GreenYellow, Green, BlueGreen, Blue, VioletBlue, Violet, RedViolet, LightGray, DarkGray, Random };
|
|
|
|
|
|
private Hand hand;
|
|
|
|
|
|
public GameObject popPrefab;
|
|
|
|
|
|
public float maxVelocity = 5f;
|
|
|
|
|
|
public float lifetime = 15f;
|
|
|
public bool burstOnLifetimeEnd = false;
|
|
|
|
|
|
public GameObject lifetimeEndParticlePrefab;
|
|
|
public SoundPlayOneshot lifetimeEndSound;
|
|
|
|
|
|
private float destructTime = 0f;
|
|
|
private float releaseTime = 99999f;
|
|
|
|
|
|
public SoundPlayOneshot collisionSound;
|
|
|
private float lastSoundTime = 0f;
|
|
|
private float soundDelay = 0.2f;
|
|
|
|
|
|
private Rigidbody balloonRigidbody;
|
|
|
|
|
|
private bool bParticlesSpawned = false;
|
|
|
|
|
|
private static float s_flLastDeathSound = 0f;
|
|
|
|
|
|
|
|
|
//-------------------------------------------------
|
|
|
void Start()
|
|
|
{
|
|
|
destructTime = Time.time + lifetime + Random.value;
|
|
|
hand = GetComponentInParent<Hand>();
|
|
|
balloonRigidbody = GetComponent<Rigidbody>();
|
|
|
}
|
|
|
|
|
|
|
|
|
//-------------------------------------------------
|
|
|
void Update()
|
|
|
{
|
|
|
if ( ( destructTime != 0 ) && ( Time.time > destructTime ) )
|
|
|
{
|
|
|
if ( burstOnLifetimeEnd )
|
|
|
{
|
|
|
SpawnParticles( lifetimeEndParticlePrefab, lifetimeEndSound );
|
|
|
}
|
|
|
|
|
|
Destroy( gameObject );
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
//-------------------------------------------------
|
|
|
private void SpawnParticles( GameObject particlePrefab, SoundPlayOneshot sound )
|
|
|
{
|
|
|
// Don't do this twice
|
|
|
if ( bParticlesSpawned )
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
bParticlesSpawned = true;
|
|
|
|
|
|
if ( particlePrefab != null )
|
|
|
{
|
|
|
GameObject particleObject = Instantiate( particlePrefab, transform.position, transform.rotation ) as GameObject;
|
|
|
particleObject.GetComponent<ParticleSystem>().Play();
|
|
|
Destroy( particleObject, 2f );
|
|
|
}
|
|
|
|
|
|
if ( sound != null )
|
|
|
{
|
|
|
float lastSoundDiff = Time.time - s_flLastDeathSound;
|
|
|
if ( lastSoundDiff < 0.1f )
|
|
|
{
|
|
|
sound.volMax *= 0.25f;
|
|
|
sound.volMin *= 0.25f;
|
|
|
}
|
|
|
sound.Play();
|
|
|
s_flLastDeathSound = Time.time;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
//-------------------------------------------------
|
|
|
void FixedUpdate()
|
|
|
{
|
|
|
// Slow-clamp velocity
|
|
|
if ( balloonRigidbody.velocity.sqrMagnitude > maxVelocity )
|
|
|
{
|
|
|
balloonRigidbody.velocity *= 0.97f;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
//-------------------------------------------------
|
|
|
private void ApplyDamage()
|
|
|
{
|
|
|
SpawnParticles( popPrefab, null );
|
|
|
Destroy( gameObject );
|
|
|
}
|
|
|
|
|
|
|
|
|
//-------------------------------------------------
|
|
|
void OnCollisionEnter( Collision collision )
|
|
|
{
|
|
|
if ( bParticlesSpawned )
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
Hand collisionParentHand = null;
|
|
|
|
|
|
BalloonHapticBump balloonColliderScript = collision.gameObject.GetComponent<BalloonHapticBump>();
|
|
|
|
|
|
if ( balloonColliderScript != null && balloonColliderScript.physParent != null )
|
|
|
{
|
|
|
collisionParentHand = balloonColliderScript.physParent.GetComponentInParent<Hand>();
|
|
|
}
|
|
|
|
|
|
if ( Time.time > ( lastSoundTime + soundDelay ) )
|
|
|
{
|
|
|
if ( collisionParentHand != null ) // If the collision was with a controller
|
|
|
{
|
|
|
if ( Time.time > ( releaseTime + soundDelay ) ) // Only play sound if it's not immediately after release
|
|
|
{
|
|
|
collisionSound.Play();
|
|
|
lastSoundTime = Time.time;
|
|
|
}
|
|
|
}
|
|
|
else // Collision was not with a controller, play sound
|
|
|
{
|
|
|
collisionSound.Play();
|
|
|
lastSoundTime = Time.time;
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if ( destructTime > 0 ) // Balloon is released away from the controller, don't do the haptic stuff that follows
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if ( balloonRigidbody.velocity.magnitude > ( maxVelocity * 10 ) )
|
|
|
{
|
|
|
balloonRigidbody.velocity = balloonRigidbody.velocity.normalized * maxVelocity;
|
|
|
}
|
|
|
|
|
|
if ( hand != null )
|
|
|
{
|
|
|
ushort collisionStrength = (ushort)Mathf.Clamp( Util.RemapNumber( collision.relativeVelocity.magnitude, 0f, 3f, 500f, 800f ), 500f, 800f );
|
|
|
|
|
|
hand.TriggerHapticPulse( collisionStrength );
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
//-------------------------------------------------
|
|
|
public void SetColor( BalloonColor color )
|
|
|
{
|
|
|
GetComponentInChildren<MeshRenderer>().material.color = BalloonColorToRGB( color );
|
|
|
}
|
|
|
|
|
|
|
|
|
//-------------------------------------------------
|
|
|
private Color BalloonColorToRGB( BalloonColor balloonColorVar )
|
|
|
{
|
|
|
Color defaultColor = new Color( 255, 0, 0 );
|
|
|
|
|
|
switch ( balloonColorVar )
|
|
|
{
|
|
|
case BalloonColor.Red:
|
|
|
return new Color( 237, 29, 37, 255 ) / 255;
|
|
|
case BalloonColor.OrangeRed:
|
|
|
return new Color( 241, 91, 35, 255 ) / 255;
|
|
|
case BalloonColor.Orange:
|
|
|
return new Color( 245, 140, 31, 255 ) / 255;
|
|
|
case BalloonColor.YellowOrange:
|
|
|
return new Color( 253, 185, 19, 255 ) / 255;
|
|
|
case BalloonColor.Yellow:
|
|
|
return new Color( 254, 243, 0, 255 ) / 255;
|
|
|
case BalloonColor.GreenYellow:
|
|
|
return new Color( 172, 209, 54, 255 ) / 255;
|
|
|
case BalloonColor.Green:
|
|
|
return new Color( 0, 167, 79, 255 ) / 255;
|
|
|
case BalloonColor.BlueGreen:
|
|
|
return new Color( 108, 202, 189, 255 ) / 255;
|
|
|
case BalloonColor.Blue:
|
|
|
return new Color( 0, 119, 178, 255 ) / 255;
|
|
|
case BalloonColor.VioletBlue:
|
|
|
return new Color( 82, 80, 162, 255 ) / 255;
|
|
|
case BalloonColor.Violet:
|
|
|
return new Color( 102, 46, 143, 255 ) / 255;
|
|
|
case BalloonColor.RedViolet:
|
|
|
return new Color( 182, 36, 102, 255 ) / 255;
|
|
|
case BalloonColor.LightGray:
|
|
|
return new Color( 192, 192, 192, 255 ) / 255;
|
|
|
case BalloonColor.DarkGray:
|
|
|
return new Color( 128, 128, 128, 255 ) / 255;
|
|
|
case BalloonColor.Random:
|
|
|
int randomColor = Random.Range( 0, 12 );
|
|
|
return BalloonColorToRGB( (BalloonColor)randomColor );
|
|
|
}
|
|
|
|
|
|
return defaultColor;
|
|
|
}
|
|
|
}
|
|
|
}
|