void FixedUpdate() { if (isWaitingToSpawn) { if (spawningObject == null) { Respawn(Random.Range(0, PathStarts.Length)); } else { rgd.position = new Vector3(9999.0f, 9999.0f, 9999.0f); } } else if (IsOnBelt) { if (spawningObject == this && pf.Current.Previous != null) { spawningObject = null; } } else if (rgd.velocity.sqrMagnitude < RespawnMaxSpeed * RespawnMaxSpeed && (HumanBehavior.Instance.MyTransform.position - rgd.position).sqrMagnitude > RespawnRadius * RespawnRadius) { isWaitingToSpawn = true; rgd.isKinematic = true; lvt.enabled = false; } }
public void Push() { for (int i = 0; i < rbodies.Count; i++) { ConveyorBeltObject conveyorBeltObject = rbodies[i]; Vector3 worldVelocity = conveyorBeltObject.rbody.velocity; Vector3 worldForceDirection = (transform.rotation * forceDirection) * force; Vector3 velocityAlongDirection = Vector3.Project(worldVelocity, worldForceDirection); Vector3 nearestPointOnBelt = transform.position + Vector3.Project((conveyorBeltObject.rbody.transform.position - transform.position), transform.rotation * forceDirection); conveyorBeltObject.rbody.AddForce((nearestPointOnBelt - conveyorBeltObject.rbody.transform.position) * conveyorBeltObject.force, ForceMode.Force); Debug.DrawLine(nearestPointOnBelt, conveyorBeltObject.rbody.transform.position, Color.green); if (velocityAlongDirection.sqrMagnitude < force * force) { conveyorBeltObject.rbody.AddForce(transform.localToWorldMatrix * forceDirection.normalized * force * conveyorBeltObject.force, ForceMode.Force); } conveyorBeltObject.force = Mathf.Clamp(conveyorBeltObject.force + Time.fixedDeltaTime, 0f, 1f); rbodies[i] = conveyorBeltObject; } }
private void OnTriggerEnter(Collider other) { ConveyorBeltObject conveyorBeltObject = new ConveyorBeltObject(); conveyorBeltObject.rbody = other.attachedRigidbody; conveyorBeltObject.force = 0f; rbodies.Add(conveyorBeltObject); }
private void OnTriggerExit(Collider other) { for (int i = 0; i < rbodies.Count; i++) { ConveyorBeltObject conveyorBeltObject = rbodies[i]; if (conveyorBeltObject.rbody.Equals(other.attachedRigidbody)) { rbodies.Remove(conveyorBeltObject); break; } } }
void Awake() { pf = GetComponent<PathFollower>(); lvt = GetComponent<Levitatable>(); if (PathStarts == null) { PathStarts = GameObject.FindObjectsOfType<ConveyorBeltStartNode>().Select(cbsn => cbsn.GetComponent<PathNode>()).ToArray(); } spawningObject = null; if (RespawnOnStart) { isWaitingToSpawn = true; } else { isWaitingToSpawn = false; } }
private void Respawn(int index) { isWaitingToSpawn = false; rgd.isKinematic = true; lvt.enabled = false; pf.enabled = true; pf.Current = PathStarts[index]; spawningObject = this; rgd.position = pf.Current.MyTransform.position; }