Newer
Older
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShinyThings : MonoBehaviour
{
public WorldCursor Cursor;
//Attributes for Highlighting of Facts when Mouse-Over
private string selectableTag = "Selectable";
private Transform lastFactSelection;
public Material defaultMaterial;
public Material highlightMaterial;
//Variables for Pushout-Highlighting
private Fact highlightedPushoutFact;
private bool timerActive { get; set; }
private float timer { get; set; }
John Schihada
committed
private float timerDuration = 2.5f;
private float timerDurationEnd = 5.0f;
private int slowDownCount = 8;
private int slowDownCounter;
private bool[] slowDownSwitch;
private float simulationSpeed;
private Boolean pushoutFail;
public GameObject directionalLight;
private Color lightColor;
private Color tempColor;
private Color darkColor;
private Boolean factAnimationActive = false;
public Material pushoutMaterial;
private Material tempMaterial;
Marco Zimmer
committed
public GameObject
Fireworks_Animation,
RainPrefab;
// Start is called before the first frame update
if (Cursor == null)
Cursor = GetComponent<WorldCursor>();
if (directionalLight == null)
directionalLight = FindObjectOfType<Light>().gameObject;
CommunicationEvents.PushoutFactEvent.AddListener(HighlightFact);
John Schihada
committed
CommunicationEvents.PushoutFactFailEvent.AddListener(StartPushoutFactFailHighlighting);
CommunicationEvents.AnimateExistingFactEvent.AddListener(HighlightWithFireworks);
speedSlowDown = timerDurationEnd * 10;
John Schihada
committed
lightColor = directionalLight.GetComponent<Light>().color;
slowDownSwitch = new bool[slowDownCount];
Array.Clear(slowDownSwitch, 0, slowDownSwitch.Length);
this.timerActive = false;
this.timer = 0;
}
// Update is called once per frame
{
//SELECTION-HIGHLIGHTING-PART
//Check if a Fact was Hit
RaycastHit Hit = Cursor.Hit;
Highlighting(Hit);
//LineRendering-Part
//@John before: hit.point
//Debug.Log(this.transform.position);
John Schihada
committed
//If the Timer is Active, check Pushout-Highlighting
if (this.timerActive)
{
this.timer += Time.deltaTime;
John Schihada
committed
CheckPushoutHighlighting();
}
private void Highlighting(RaycastHit hit)
{
if (hit.transform != null)
Transform selection = hit.transform;
//only do stuff if selection changes
//Set the last Fact unselected
if (this.lastFactSelection != null)
{
if (selection == this.lastFactSelection) return;
//Invoke the EndHighlightEvent that will be handled in FactSpawner
// CommunicationEvents.EndHighlightEvent.Invoke(this.lastFactSelection);
if (this.lastFactSelection.CompareTag(selectableTag))
OnMouseOverFactEnd(lastFactSelection);
else
OnMouseOverSnapZoneEnd(lastFactSelection);
this.lastFactSelection = null;
}
//Set the Fact that was Hit as selected
if (selection.CompareTag(selectableTag))
{
//Invoke the HighlightEvent that will be handled in FactSpawner
this.lastFactSelection = selection;
//CommunicationEvents.HighlightEvent.Invoke(selection);
OnMouseOverFact(lastFactSelection);
}
else if (selection.CompareTag("SnapZone"))
{
this.lastFactSelection = selection;
OnMouseOverSnapZone(lastFactSelection);
}
}
//SELECTION-HIGHLIGHTING-PART-END
}
private void OnMouseOverSnapZoneEnd(Transform selection)
{
Renderer selectionRenderer;
if (selection != null)
{
selectionRenderer = selection.GetComponent<Renderer>();
if (selectionRenderer != null)
{
//Add transparency
var oldCol = selectionRenderer.material.color;
oldCol.a = .25f;
selectionRenderer.material.color = oldCol;
}
private void OnMouseOverSnapZone(Transform selection)
{
Renderer selectionRenderer;
selectionRenderer = selection.GetComponent<Renderer>();
if (selectionRenderer != null)
{
//Remove transparency
var oldCol = selectionRenderer.material.color;
oldCol.a = .75f;
selectionRenderer.material.color = oldCol;
}
public void OnMouseOverFact(Transform selection)
{
Renderer selectionRenderer;
selectionRenderer = selection.GetComponent<Renderer>();
if (selectionRenderer != null)
{
//Set the Material of the Fact, where the mouse is over, to a special one
selectionRenderer.material = highlightMaterial;
}
}
public void OnMouseOverFactEnd(Transform selection)
{
Renderer selectionRenderer;
if (selection != null)
{
selectionRenderer = selection.GetComponent<Renderer>();
if (selectionRenderer != null)
{
//Set the Material of the fact back to default
selectionRenderer.material = defaultMaterial;
}
}
}
public void HighlightWithFireworks(Fact fact)
{
Marco Zimmer
committed
GameObject fireworksRepresentation = Fireworks_Animation;
this.extraHighlight = GameObject.Instantiate(fireworksRepresentation);
this.extraHighlight.transform.position = fact.Representation.transform.position;
HighlightFact(fact);
}
public void HighlightFact(Fact startFact) {
highlightedPushoutFact = startFact;
if (typeof(PointFact).IsInstanceOfType(highlightedPushoutFact))
{
PointFact fact = (PointFact)highlightedPushoutFact;
tempMaterial = fact.Representation.transform.GetChild(0).GetComponent<MeshRenderer>().material;
fact.Representation.transform.GetChild(0).GetComponent<MeshRenderer>().material = pushoutMaterial;
}
else if (typeof(LineFact).IsInstanceOfType(highlightedPushoutFact))
{
LineFact fact = (LineFact)highlightedPushoutFact;
John Schihada
committed
tempMaterial = fact.Representation.transform.GetChild(0).GetChild(1).GetComponent<MeshRenderer>().material;
fact.Representation.transform.GetChild(0).GetChild(1).GetComponent<MeshRenderer>().material = pushoutMaterial;
}
else if (typeof(AngleFact).IsInstanceOfType(highlightedPushoutFact)) {
AngleFact fact = (AngleFact)highlightedPushoutFact;
John Schihada
committed
tempMaterial = fact.Representation.transform.GetChild(0).GetComponent<MeshRenderer>().material;
fact.Representation.transform.GetChild(0).GetComponent<MeshRenderer>().material = pushoutMaterial;
John Schihada
committed
this.pushoutFail = false;
this.slowDownCounter = 0;
public void StopHighlighting() {
if (typeof(PointFact).IsInstanceOfType(highlightedPushoutFact))
{
PointFact fact = (PointFact)highlightedPushoutFact;
fact.Representation.transform.GetChild(0).GetComponent<MeshRenderer>().material = tempMaterial;
}
else if (typeof(LineFact).IsInstanceOfType(highlightedPushoutFact))
{
LineFact fact = (LineFact)highlightedPushoutFact;
John Schihada
committed
fact.Representation.transform.GetChild(0).GetChild(1).GetComponent<MeshRenderer>().material = tempMaterial;
}
else if (typeof(AngleFact).IsInstanceOfType(highlightedPushoutFact))
{
AngleFact fact = (AngleFact)highlightedPushoutFact;
John Schihada
committed
fact.Representation.transform.GetChild(0).GetComponent<MeshRenderer>().material = tempMaterial;
if (this.extraHighlight != null)
{
GameObject.Destroy(this.extraHighlight);
this.extraHighlight = null;
}
//Event for the happy Task-Charakter
CommunicationEvents.PushoutFactEndEvent.Invoke(null);
}
John Schihada
committed
public void StartPushoutFactFailHighlighting(Fact startFact)
{
this.pushoutFail = true;
this.tempColor = this.lightColor;
this.darkColor = new Color(0.6f, 0.6f, 0.6f);
this.timerActive = true;
}
public void CheckPushoutHighlighting() {
//If the Pushout suceeded -> Fireworks-Animation
if (this.pushoutFail == false)
{
//Fireworks already started in StartPushoutFactHighlighting
if (this.timer >= this.timerDuration)
{
//After this.timerDuration+this.timerDurationEnd: Destroy Fireworks-Animation
if (this.timer >= this.timerDuration + this.timerDurationEnd)
{
this.timerActive = false;
this.timer = 0;
StopHighlighting();
John Schihada
committed
}
//After this.timerDuration: Slow Down Fireworks
Marco Zimmer
committed
else if (this.extraHighlight != null)
John Schihada
committed
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
{
ParticleSystem main1 = this.extraHighlight.transform.GetChild(0).GetComponent<ParticleSystem>();
ParticleSystem main2 = this.extraHighlight.transform.GetChild(1).GetComponent<ParticleSystem>();
//Save StartSpeed when first slowing down
if (this.slowDownCounter == 0)
this.simulationSpeed = main1.main.simulationSpeed;
slowDownAnimation(main1, main2);
}
}
}
//If the Pushout failed -> Rain-Animation
else
{
if (this.timer <= 0.5f * (this.timerDurationEnd))
{
//sky slowly gets dark
if (directionalLight.GetComponent<Light>().color.r > darkColor.r)
{
tempColor.r -= Time.deltaTime/5;
tempColor.g -= Time.deltaTime/5;
tempColor.b -= Time.deltaTime/5;
directionalLight.GetComponent<Light>().color = tempColor;
}
}
else if (this.timer <= 2.0f * this.timerDuration + 0.5f * this.timerDurationEnd)
{
//Rain-Animation starts
if (!factAnimationActive)
{
Marco Zimmer
committed
GameObject RainRepresentation = RainPrefab;
John Schihada
committed
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
RainRepresentation.transform.position = new Vector3(0, 40, 0);
this.extraHighlight = GameObject.Instantiate(RainRepresentation);
factAnimationActive = true;
}
}
//Rain-Animation stops and sky slowly gets bright again
else if (this.timer <= 2.0f * this.timerDuration + this.timerDurationEnd)
{
if (factAnimationActive)
{
//Stop Rain
GameObject.Destroy(this.extraHighlight);
this.extraHighlight = null;
factAnimationActive = false;
}
//sky slowly gets bright again
if (directionalLight.GetComponent<Light>().color.r <= lightColor.r)
{
tempColor.r += Time.deltaTime/5;
tempColor.g += Time.deltaTime/5;
tempColor.b += Time.deltaTime/5;
directionalLight.GetComponent<Light>().color = tempColor;
}
}
else
{
//Stop timer
this.timerActive = false;
this.timer = 0;
}
}
}
public void slowDownAnimation(ParticleSystem main1, ParticleSystem main2) {
if (this.timer <= this.timerDuration + (this.timerDurationEnd*((float)slowDownCounter+1.0f)/(float)slowDownCount))
{
if(slowDownSwitch[(int)((this.timer-this.timerDuration)/(this.timerDuration/(float)slowDownCount))] == false)
if (slowDownCounter < slowDownCount)
{
var mainModule1 = main1.main;
float speed = mainModule1.simulationSpeed;
mainModule1.simulationSpeed = speed - (float)(this.simulationSpeed / (float)slowDownCount);
var mainModule2 = main2.main;
mainModule2.simulationSpeed = speed - (float)(this.simulationSpeed / (float)slowDownCount);
slowDownSwitch[slowDownCounter] = true;
}
}
}