Example #1
0
 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);
         }
     }
 }
Example #2
0
 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;
 }
Example #3
0
 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;
 }
Example #4
0
 private IEnumerator TrackCoroutine(DartChainV3 _kinematicChain)
 {
     while (true)
     {
         if (_kinematicChain != null)
         {
             transform.position = _kinematicChain.transform.position;
         }
         yield return(new WaitForEndOfFrame());
     }
 }
Example #5
0
    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);
    }
Example #6
0
 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);
         }
     }
 }
Example #7
0
 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);
         }
     }
 }
Example #8
0
 internal void Track(DartChainV3 _kinematicChain)
 {
     _mainRigidBody.isKinematic = true;
     StartCoroutine(TrackCoroutine(_kinematicChain));
 }
Example #9
0
 private IEnumerator TrackCoroutine(DartChainV3 _kinematicChain)
 {
     while(true)
     {
         if(_kinematicChain != null)
         transform.position = _kinematicChain.transform.position;
         yield return new WaitForEndOfFrame();
     }
 }
Example #10
0
 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);
         }
     }
 }
Example #11
0
 public void SubscribeToChain(DartChainV3 chain)
 {
     chain.BrokenOnTolerance += (sender, e) => OnDartDestroyed();
     chain.BrokenOnGround += (sender, e) => OnDartDestroyed();
 }
Example #12
0
 public void SubscribeToChain(DartChainV3 chain)
 {
     chain.BrokenOnTolerance += (sender, e) => OnDartDestroyed();
     chain.BrokenOnGround    += (sender, e) => OnDartDestroyed();
 }
Example #13
0
 internal void Track(DartChainV3 _kinematicChain)
 {
     _mainRigidBody.isKinematic = true;
     StartCoroutine(TrackCoroutine(_kinematicChain));
 }