You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

223 lines
5.9 KiB
C#

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

//======= 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;
}
}
}