bool StackGear() { GearPin closestPin = ClosestPin(); gearFixed = false; if (closestPin != null) { gearPin = closestPin; transform.forward = closestPin.transform.up; gearFixed = true; return(true); } return(false); }
private void Awake() { foreach (Transform pinPivot in pinsPivots) { GearPin newPin = Instantiate(pinPrefab); newPin.transform.position = pinPivot.position; pins.Add(newPin); } foreach (GearStack gear in gears) { gearRotations.Add(gear.GetComponent <GearRotation>()); gear.pins = pins; } }
GearPin ClosestPin() { float closestDis = (pins[0].Position - transform.position).magnitude; GearPin closestPin = pins[0]; for (int i = 1; i < pins.Count; i++) { float newDis = (pins[i].Position - transform.position).magnitude; if (!pins[i].occupied && newDis < closestDis) { closestDis = newDis; closestPin = pins[i]; } } if (closestDis < snappingDis.Value) { return(closestPin); } return(null); }
private void Update() { if (gearHeld) { rb.useGravity = false; gearRotation.enabled = false; if (gearPin != null) { gearPin.occupied = false; gearPin = null; } gearSnapping = StackGear(); rb.isKinematic = true; mc.isTrigger = true; } else if (gearSnapping) { rb.angularVelocity = Vector3.zero; rb.velocity = Vector3.zero; rb.isKinematic = false; rb.useGravity = false; gearRotation.enabled = true; transform.position = Vector3.SmoothDamp(transform.position, gearPin.Position, ref currentVelocity, snapTime); if ((transform.position - gearPin.Position).magnitude < 0.01f) { gearSnapping = false; transform.position = gearPin.Position; } mc.isTrigger = true; } else if (!gearFixed) { mc.isTrigger = false; rb.useGravity = true; } }