Created
December 21, 2012 23:19
-
-
Save LoganBarnett/4356505 to your computer and use it in GitHub Desktop.
Some code demonstrating the use of Linq, Lamdas, and GoodStuff
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| using UnityEngine; | |
| using System.Collections; | |
| using System.Collections.Generic; | |
| using System.Linq; | |
| using GoodStuff.NaturalLanguage; | |
| public class TractorBeam : MonoBehaviour { | |
| public float tractorBeamRange = 10f; | |
| public GameObject tractorBeamPrefab; | |
| public GameObject tractorAudioPrefab; | |
| float tractorTime = 100f; | |
| int tractorBeamsPerObject = 4; | |
| List<GameObject> candidates = new List<GameObject>(); | |
| List<TractoringObject> tractoringObjects = new List<TractoringObject>(); | |
| class TractoringObject { | |
| public GameObject Object { get; set; } | |
| public float FinishTime { get; set; } | |
| public List<GameObject> TractorBeams { get; set; } | |
| public GameObject TractorAudio { get; set; } | |
| } | |
| public void AddTractorCandidate(GameObject candidate) { | |
| candidates.Add(candidate); | |
| } | |
| void Update() { | |
| var cleanCandidates = false; | |
| candidates.Where(c => Vector3.Distance(transform.position, c.transform.position) <= tractorBeamRange).Each(c => { | |
| var tractorBeams = Enumerable.Range(0, tractorBeamsPerObject).Select(unused => { | |
| var tractorBeam = Instantiate(tractorBeamPrefab, transform.position, Quaternion.identity) as GameObject; | |
| tractorBeam.transform.parent = transform; | |
| tractorBeam.GetComponent<LightningBolt>().target = c.transform; | |
| return tractorBeam; | |
| }); | |
| var tractorAudio = Instantiate(tractorAudioPrefab, c.transform.position, Quaternion.identity) as GameObject; | |
| tractorAudio.transform.parent = c.transform; | |
| tractoringObjects.Add(new TractoringObject { | |
| Object = c, | |
| FinishTime = Time.time + tractorTime, | |
| TractorBeams = tractorBeams.ToList(), | |
| TractorAudio = tractorAudio | |
| }); | |
| cleanCandidates = true; | |
| }); | |
| if(cleanCandidates) { | |
| candidates.RemoveAll(c => tractoringObjects.Any(t => t.Object == c)); | |
| cleanCandidates = false; | |
| } | |
| tractoringObjects.Each(tractoringObject => { | |
| var distance = Vector3.Distance(transform.position, tractoringObject.Object.transform.position); | |
| var pitch = 1f - (distance / tractorBeamRange); | |
| tractoringObject.TractorAudio.audio.pitch = pitch; | |
| var time = (tractoringObject.FinishTime - Time.time) / tractorTime; | |
| tractoringObject.Object.transform.position = Vector3.Lerp(transform.position, tractoringObject.Object.transform.position, time); | |
| }); | |
| } | |
| void OnTriggerEnter(Collider other) { | |
| var collectedObject = tractoringObjects.FirstOrDefault(t => t.Object == other.gameObject); | |
| if(collectedObject != null) { | |
| Destroy(other.gameObject); | |
| collectedObject.TractorBeams.Each(Destroy); | |
| tractoringObjects.Remove(collectedObject); | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment