Example #1
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);
    }