private void CascadeToNeighbour(GameObject measureDistanceTo, DartChainV3 targettocascade) { if (!_crossSectionAngleCorrection.IsEdge) { var distancetochain = Vector3.Distance(measureDistanceTo.transform.position, transform.position); if (distancetochain >= _settings.HoseLength + _settings.HoseApplyForceThresholdCorrection) { var direction = measureDistanceTo.transform.position - transform.position; float distanceToMultiply; distancetochain += _settings.HosePowBaseCorrection; if (distancetochain < 1) { distancetochain += 1; distanceToMultiply = Mathf.Pow(distancetochain, 1 / _settings.HoseDistancePow); } else { distanceToMultiply = Mathf.Pow(distancetochain, _settings.HoseDistancePow); } var applying = direction.normalized * _settings.HoseFlatForceMultiplier * distanceToMultiply; //Debug.Log(applying); _mainRigidBody.AddForce(applying); targettocascade.CascadeForce(this, _settings.HoseFlatForceMultiplier * _settings.HoseMitigator * distancetochain, direction); } } }
public void AddNext(DartChainV3 toAdd, DartGunSettings settings) { _settings = settings; _nextChain = toAdd; _crossSectionAngleCorrection._nextGameObject = toAdd.gameObject; _distanceJoint.connectedBody = toAdd._mainRigidBody; toAdd._crossSectionAngleCorrection._previousGameObject = gameObject; _nextChain._previousChain = this; }
private IEnumerator TrackCoroutine(DartChainV3 _kinematicChain) { while (true) { if (_kinematicChain != null) { transform.position = _kinematicChain.transform.position; } yield return(new WaitForEndOfFrame()); } }
private IEnumerator SpawnHosePortions(DartGunV2 dartGunV2, DartV2 leDart) { DartChainV3 closestHose = leDart._kinematicChain; bool _dartCollided = false; leDart.DartCollision += (sender, e) => _dartCollided = true; int numberOfCrossSectionsSpawned = 0; while (!_dartCollided) { //Debug.Log(Vector3.Distance(closestHose.transform.position, dartGunV2._kinematicChain.transform.position) + " " + Settings.HoseLength); while (Vector3.Distance(leDart._kinematicChain.transform.position, dartGunV2._kinematicChain.transform.position) > Settings.HoseLength * numberOfCrossSectionsSpawned) { //Debug.Log(Vector3.Distance(closestHose.transform.position, dartGunV2._kinematicChain.transform.position) + " " + Settings.HoseLength); var positionRelative = -closestHose.transform.position + dartGunV2._kinematicChain.transform.position; var newClosestHose = (DartChainV3)Instantiate(_dartChainPrefab, closestHose.transform.position + positionRelative, _dartSpawnPoint.transform.rotation); leDart.AssignOwner(this); leDart.SubscribeToChain(newClosestHose); newClosestHose._distanceJoint.distance = Settings.JointLength; newClosestHose.SubscribeToDart(leDart, this); newClosestHose.AddNext(closestHose, Settings); closestHose = newClosestHose; numberOfCrossSectionsSpawned++; } //Debug.Break(); yield return(new WaitForFixedUpdate()); } //Amazingly bad practice :( if (numberOfCrossSectionsSpawned <= Settings.MinimumCrossSectionsToSpawn) { while (numberOfCrossSectionsSpawned <= Settings.MinimumCrossSectionsToSpawn) { var positionRelative = -closestHose.transform.position + dartGunV2._kinematicChain.transform.position; var newClosestHose = (DartChainV3)Instantiate(_dartChainPrefab, closestHose.transform.position + positionRelative, _dartSpawnPoint.transform.rotation); leDart.AssignOwner(this); leDart.SubscribeToChain(newClosestHose); newClosestHose._distanceJoint.distance = Settings.JointLength; newClosestHose.SubscribeToDart(leDart, this); newClosestHose.AddNext(closestHose, Settings); closestHose = newClosestHose; numberOfCrossSectionsSpawned++; } //Debug.Break(); } closestHose.Track(_kinematicChain); }
private void CascadeForce(DartChainV3 source, float forcetoAdd, Vector3 previousDirection) { if (!_crossSectionAngleCorrection.IsEdge) { var direction = source.transform.position - transform.position; direction = (direction + _settings.HoseOriginalDirectionWeight * previousDirection).normalized; _mainRigidBody.AddForce(direction.normalized * forcetoAdd); if (source == _previousChain) { _nextChain.CascadeForce(this, forcetoAdd * _settings.HoseMitigator, direction); } else if (source == _nextChain) { _previousChain.CascadeForce(this, forcetoAdd * _settings.HoseMitigator, direction); } } }
internal void Track(DartChainV3 _kinematicChain) { _mainRigidBody.isKinematic = true; StartCoroutine(TrackCoroutine(_kinematicChain)); }
private IEnumerator TrackCoroutine(DartChainV3 _kinematicChain) { while(true) { if(_kinematicChain != null) transform.position = _kinematicChain.transform.position; yield return new WaitForEndOfFrame(); } }
private void CascadeToNeighbour(GameObject measureDistanceTo, DartChainV3 targettocascade) { if (!_crossSectionAngleCorrection.IsEdge) { var distancetochain = Vector3.Distance(measureDistanceTo.transform.position, transform.position); if (distancetochain >= _settings.HoseLength + _settings.HoseApplyForceThresholdCorrection) { var direction = measureDistanceTo.transform.position - transform.position; float distanceToMultiply; distancetochain += _settings.HosePowBaseCorrection; if (distancetochain < 1) { distancetochain += 1; distanceToMultiply = Mathf.Pow(distancetochain, 1 / _settings.HoseDistancePow); } else distanceToMultiply = Mathf.Pow(distancetochain, _settings.HoseDistancePow); var applying = direction.normalized * _settings.HoseFlatForceMultiplier * distanceToMultiply; //Debug.Log(applying); _mainRigidBody.AddForce(applying); targettocascade.CascadeForce(this, _settings.HoseFlatForceMultiplier * _settings.HoseMitigator * distancetochain, direction); } } }
public void SubscribeToChain(DartChainV3 chain) { chain.BrokenOnTolerance += (sender, e) => OnDartDestroyed(); chain.BrokenOnGround += (sender, e) => OnDartDestroyed(); }