private IEnumerator GenerateWake(Wake wake) { for (var i = 0; i < 2; i++) { var wl = new WakeLine { points = new List <WakePoint>() }; var wakeLoading = wakePrefab.InstantiateAsync(Vector3.zero, Quaternion.Euler(90f, 0, 0)); yield return(wakeLoading); _lrs.Add(wakeLoading.Result); wakeLoading.Result.TryGetComponent(out wl.lineRenderer); wakeLoading.Result.hideFlags = HideFlags.HideAndDontSave; wake.lines.Add(wl); } }
public float _maxAge = 5f; // how long the wake lasts for void OnEnable() { // Initial setup for wakes foreach (Wake w in _wakes) { for (int i = 0; i < 2; i++) { WakeLine wl = new WakeLine(); GameObject go = GameObject.Instantiate(_wakePrefab, Vector3.zero, Quaternion.Euler(90f, 0, 0)); _lrs.Add(go); LineRenderer LR = go.GetComponent <LineRenderer>(); wl.points = new List <WakePoint>(); wl._lineRenderer = LR; w.lines.Add(wl); go.hideFlags = HideFlags.HideAndDontSave; } } }
private void DoWake(int side, Wake wake, WakeLine wakeLine) { var origin = wake.origin; origin.x *= side; origin = transform.TransformPoint(origin); origin.y = 0;//flatten origin in world var pointCount = wakeLine.points.Count; //////////////////////////// create points, if needed /////////////////////////////// if (pointCount == 0) { wakeLine.points.Insert(0, CreateWakePoint(origin, side)); pointCount++; } else if (Vector3.Distance(wakeLine.points[0].pos, origin) > genDistance) { wakeLine.points.Insert(0, CreateWakePoint(origin, side)); pointCount++; } ///////////////////////////// kill points, if needed //////////////////////////////// for (int i = wakeLine.points.Count - 1; i >= 0; i--) { if (wakeLine.points[i].age > maxAge) { wakeLine.points.RemoveAt(i); pointCount--; } else { wakeLine.points[i].age += Time.deltaTime; // increment age wakeLine.points[i].pos += Time.deltaTime * 3 * wakeLine.points[i].dir; // move points by dir } } ///////////////////// Create the line renderer points /////////////////////////////// wakeLine.lineRenderer.positionCount = pointCount + 1; wakeLine.lineRenderer.SetPosition(0, origin); for (var i = 0; i < pointCount; i++) { wakeLine.lineRenderer.SetPosition(i + 1, wakeLine.points[i].pos); } }
void Update() { Vector3 origin; //For each wake pair var wCount = _wakes.Count; for (int w = 0; w < wCount; w++) { Wake _wake = _wakes[w]; int s = 0; for (int x = -1; x <= 1; x += 2) { origin = _wake.origin; origin.x *= x; origin = transform.TransformPoint(origin); origin.y = 0;//flatten origin in world WakeLine line = _wake.lines[s]; var pointCount = line.points.Count; //////////////////////////// create points, if needed /////////////////////////////// if (pointCount == 0) { line.points.Insert(0, CreateWakePoint(origin, x)); pointCount++; } else if (Vector3.Distance(line.points[0].pos, origin) > _genDistance) { line.points.Insert(0, CreateWakePoint(origin, x)); pointCount++; } ///////////////////////////// kill points, if needed //////////////////////////////// for (int i = line.points.Count - 1; i >= 0; i--) { if (line.points[i].age > _maxAge) { line.points.RemoveAt(i); pointCount--; } else { line.points[i].age += Time.deltaTime; // increment age line.points[i].pos += line.points[i].dir * _speed * Time.deltaTime; // move points by dir } } ///////////////////// Create the line renderer points /////////////////////////////// line._lineRenderer.positionCount = pointCount + 1; line.poses[0] = origin; for (var i = 0; i < pointCount; i++) { if (i + 1 == line.poses.Length) { break; } line.poses[i + 1] = line.points[i].pos; } GerstnerWavesJobs.UpdateSamplePoints(line.poses, line.guid); GerstnerWavesJobs.GetData(line.guid, ref line.heights); origin.y = NeoOcean.oceanheight + line.heights[0].y; for (var i = 0; i < pointCount; i++) { if (i + 1 == line.poses.Length) { break; } line.points[i].pos.y = NeoOcean.oceanheight + line.heights[i + 1].y; } line._lineRenderer.SetPosition(0, origin); for (var i = 0; i < pointCount; i++) { line._lineRenderer.SetPosition(i + 1, line.points[i].pos); } s++; } } }