Skip to content

Instantly share code, notes, and snippets.

@LoganBarnett
Created December 21, 2012 23:19
Show Gist options
  • Select an option

  • Save LoganBarnett/4356505 to your computer and use it in GitHub Desktop.

Select an option

Save LoganBarnett/4356505 to your computer and use it in GitHub Desktop.
Some code demonstrating the use of Linq, Lamdas, and GoodStuff
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