public override void AddItem(Item item) { SplineReplicator replicator = gameObject.AddComponent <SplineReplicator>(); replicator.Item = item; SplineReplicatorList.Add(replicator); }
public override void RemoveItem(Item item) { #if LOG Debug.Log("RemoveItem " + this.name); #endif SplineReplicator replicator = SplineReplicatorList.Find(r => r.Item == item); SplineReplicatorList.Remove(replicator); Destroy(replicator); SetStartEndPoint(); SetColliderSize(); }
private void InsertReplicator(SplineReplicator replicator, Vector3 inserPoint) { Vector3 from = _pointArray[0].transform.position; Vector3 to = _pointArray[1].transform.position; float fromToDistance = Vector3.Distance(from, to); float inserPointDistance = Vector3.Distance(from, inserPoint); float insertRatio = inserPointDistance / fromToDistance; float midRatio = 0f; float priorRatio = 0f; int insertIndex = -1; for (int i = 0; i < SplineReplicatorList.Count; ++i) { midRatio = (Vector3.Distance(from, SplineReplicatorList[i].DuplicateRangeMidPoint()) / fromToDistance); if (insertRatio > priorRatio && insertRatio < midRatio) { insertIndex = i; break; } priorRatio = midRatio; } if (insertIndex == -1) { //check if it is in last segement between final item and end if (insertRatio > priorRatio && insertRatio < 1f) { insertIndex = SplineReplicatorList.Count; } //if beyond 0 to 1, just force it to beginning or end if (insertRatio > 1f) { insertIndex = SplineReplicatorList.Count; } if (insertRatio < 0f) { insertIndex = 0; } } //if this is in the very last spot or there is none added, then add instead of insert if (insertIndex != -1 && SplineReplicatorList.Count == 0) { SplineReplicatorList.Add(replicator); } else if (insertIndex != -1) { SplineReplicatorList.Insert(insertIndex, replicator); } }
private void SetColliderSize() { for (int d = 0; d < SplineReplicatorList.Count; ++d) { SplineReplicator replicator = SplineReplicatorList[d]; Item item = replicator.Item; for (int i = 0; i < item.ColliderArray.Length; ++i) { item.ColliderArray[i].size = new Vector3(item.ColliderArray[i].size.x, item.ColliderArray[i].size.y, replicator.DisctanceBetweenStartEnd()); } } }
public override bool ContainsItem(Item item) { SplineReplicator replicator = SplineReplicatorList.Find(r => r.Item == item); if (replicator == null) { return(false); } else { return(true); } }
/// <summary> /// Adds the item raycast or updates it if already in list. /// </summary> /// <returns> Returns the midpoint of where Item was Added. </returns> /// <param name="itemRaycast">Item raycast.</param> /// <param name="hitPoint">Hit point.</param> public Vector3 UpdateItem(Item item, Vector3 hitPoint) { //Retieve or Create a new duplicate data SplineReplicator replicator = SplineReplicatorList.Find(r => r.Item == item); SplineReplicatorList.Remove(replicator); SetStartEndPoint(); Ray lineRay = AttachPointRay(); Vector3 linePoint = Math3D.ProjectPointOnLine(lineRay.origin, lineRay.direction, hitPoint); InsertReplicator(replicator, linePoint); SetStartEndPoint(); SetColliderSize(); return(replicator.DuplicateRangeMidPoint()); }