示例#1
0
    public List <GameObject> CutLine(Vector3 lineStart, Vector3 lineEnd)
    {
        var dist      = Vector3.Distance(lineStart, lineEnd);
        var step      = 100;
        var count     = 0;
        var pieces    = new List <GameObject>();
        var direction = (lineEnd - lineStart).normalized;

        while (count < dist)
        {
            var origin = lineStart + direction * count;
            transform.position = origin;
            var   dt     = lineStart - origin;
            float rad    = Mathf.Atan2(dt.y, dt.x);
            float degree = rad * Mathf.Rad2Deg;

            degree += 90;
            transform.localEulerAngles = new Vector3(0f, 0, degree);
            pieces = Cut();

            count += step;
        }

        lineRenderer.SetPosition(0, lineStart);
        lineRenderer.SetPosition(1, lineEnd);

        return(pieces);
    }
示例#2
0
    private void spawnPlayer()
    {
        Vector3 pos = new Vector3();
//        if(player != null)
//            Destroy(player);
        bool canSpawnunit = false;
        int  loopCount    = 0;

        while (!canSpawnunit)
        {
            pos = UnityEngine.Random.insideUnitSphere * playerSpawnSphereRadius + transform.position;
            bool isPositionTooClose = false;
            foreach (var formerPosition in occupiedPositions)
            {
                if (Vector3.Distance(formerPosition, pos) < minDistanceBetweenShips)
                {
                    isPositionTooClose = true;
                }
            }

            if (!isPositionTooClose)
            {
                canSpawnunit = true;
            }
            else
            {
                loopCount++;
                if (loopCount >= PLACEMENT_LOOP_MAX)
                {
                    playerSpawnSphereRadius += 5;
                    loopCount = 0;
                }
            }
        }

        GameObject playerObj = GameObject.Find("Player");

        // if (!playerObj || gMInstance.restartNumber > 0)
        // {
        //     player = Pool.Instance.get(PoolableTypes.Player);
        // }
        // else
        // {
        //     player = playerObj;
        // }


        player = playerObj.transform.Find("PlayerShip").gameObject;
        player.transform.position = pos;
        GameObjectStateManager.Instance.initializeDynamicObjects();

        Ship playerShip = player.GetComponent <Ship>();

        if (playerShip)
        {
            playerShip.creationSetup();
        }

        occupiedPositions.Add(pos);
    }
    /// <summary>
    /// Gets the next position in the path, ignoring positions that
    /// we are already at
    /// </summary>
    /// <returns>The next viable position in the path, or a vector 3 of Positive Infinity if no point is found</returns>
    private Vector3 GetNextPosInPath(NavMeshPath path)
    {
        /*
         * We need to be able to dismiss points that the car has reached but not the
         * nav mesh agent so we look around a car and check if the next point in the path is
         * within a given radius. If it is then we choose the second to next point in the path
         * so that our movement is smooth
         */

        if (path != null)
        {
            //Loop all of the positions that we have and check if there are any
            //that are over the distance we need, if there is one return it
            foreach (Vector3 pathPos in path.corners)
            {
                if (Vector3.Distance(transform.position, pathPos) > minPointHitDist)
                {
                    return(pathPos);
                }
            }
        }

        //No points found or path invalid, return positive infinity vector
        return(Vector3.positiveInfinity);
    }
示例#4
0
    public override void Reason(GameObject player, GameObject npc)
    {
        GameObject target = npcDetector.getNpcInRange(typeToDetect, npc.transform.position, detectrange);

        if (target != null)
        {
            BaseAI baseAi = npc.GetComponent <BaseAI>();
            baseAi.wanderAttackTransistion(target);
        }
        else
        {
            if (Vector3.Distance(startPosition, npc.transform.position)
                >= MAX_DISTANCE_TILL_RETURN_TO_START)
            {
                goBackToStart = true;
            }

            if (goBackToStart)
            {
                wanderForce = getSeek(npc.transform.position, startPosition);
                if (Vector3.Distance(startPosition, npc.transform.position) <
                    DISTANCE_TILL_STOP_RETURN)
                {
                    goBackToStart = false;
                }
            }
            else
            {
                wanderForce = getWander(npc.transform);
            }

            wanderForce += getAvoidance(npc);
        }
    }
示例#5
0
 private void DrawQuads(VisData node, int depth, List <VisData> camList)
 {
     if (node.IsLeaf)
     {
         uint ptrQuadBlock = (uint)(uint)(((node.ptrQuadBlock) / LevelShift.Div) + LevelShift.Offset);
         uint numQuadBlock = node.numQuadBlock;
         for (int i = 0; i < numQuadBlock; i++)
         {
             long index = ptrQuadBlock + i;
             Gizmos.color = new Color(1, 0, 1, 0.333f);
             if (index < 0 && index > (visiQuadCompId.Count - 1))
             {
                 break;
             }
             VisiQuad quad = visiQuadCompId[(int)Mathf.Min(Mathf.Max(index, 0), visiQuadCompId.Count - 1)];
             if (Vector3.Distance(quad.Position, camera.transform.position) < 32.0f)
             {
                 Transform child = quad.transform.GetChild(1);
                 child.gameObject.SetActive(false);
                 child = quad.transform.GetChild(0);
                 child.gameObject.SetActive(true);
             }
             else if (Vector3.Distance(quad.Position, camera.transform.position) < 128.0f)
             {
                 Transform child = quad.transform.GetChild(1);
                 child.gameObject.SetActive(true);
                 child = quad.transform.GetChild(0);
                 child.gameObject.SetActive(false);
             }
             else
             {
                 Transform child = quad.transform.GetChild(1);
                 child.gameObject.SetActive(false);
                 child = quad.transform.GetChild(0);
                 child.gameObject.SetActive(false);
             }
         }
     }
     else
     {
         VisData leftNode  = visdata[node.leftChild & 0x3fff];
         VisData rightNode = visdata[node.rightChild & 0x3fff];
         Bounds  bounds    = node.bbox.GetBounds();
         bool    canRender = false;
         if (GeometryUtility.TestPlanesAABB(planes, bounds))
         {
             canRender = true;
         }
         else if (depth > 0 && camList.Contains(node))
         {
             canRender = true;
             depth--;
         }
         if (canRender)
         {
             DrawQuads(leftNode, depth - 1, camList);
             DrawQuads(rightNode, depth - 1, camList);
         }
     }
 }
示例#6
0
    void CleverHide()
    {
        float      dist       = Mathf.Infinity;
        Vector3    chosenSpot = Vector3.zero;
        Vector3    chosenDir  = Vector3.zero;
        GameObject chosenGO   = World.Instance.GetHidingSpots()[0];

        for (int i = 0; i < World.Instance.GetHidingSpots().Length; i++)
        {
            Vector3 hideDir = World.Instance.GetHidingSpots()[i].transform.position - target.transform.position;
            Vector3 hidePos = World.Instance.GetHidingSpots()[i].transform.position + hideDir.normalized * 10; //10 is hide range

            if (Vector3.Distance(transform.position, hidePos) < dist)
            {
                chosenSpot = hidePos;
                chosenDir  = hideDir;
                chosenGO   = World.Instance.GetHidingSpots()[i];
                dist       = Vector3.Distance(transform.position, hidePos);
            }
        }

        Collider   hideCol = chosenGO.GetComponent <Collider>();
        Ray        backRay = new Ray(chosenSpot, -chosenDir.normalized);
        RaycastHit info;
        float      distance = 100.0f;

        hideCol.Raycast(backRay, out info, distance);

        Seek(info.point + chosenDir.normalized * 5);
    }
示例#7
0
    // 0 3 6 9 .. がパスの橋
    Option <Unit> NearestHandle(V3 pos)
    {
        var   nearestObj      = Option.None <Unit>();
        float nearestDistance = 0;

        for (int o = 0; o < objects.Count; o += 3)
        {
            var obj0 = objects[o + 1];
            var obj1 = objects[o + 2];
            var obj  = NearObject(pos, obj0, obj1);
            //if ( obj1 != null )
            {
                V3    p    = objects[o].transform.position;
                float dist = V3.Distance(pos, p);
                if (!nearestObj.HasValue)
                {
                    nearestObj      = obj.Some();
                    nearestDistance = dist;
                    continue;
                }

                if (dist < nearestDistance)
                {
                    nearestObj      = obj.Some();
                    nearestDistance = dist;
                }
            }
        }
        return(nearestObj);
    }
示例#8
0
    /// <summary>
    /// The Process method here is handling AI behaviour.
    /// The best way to handle AI would be to have a separate system for this, but for
    /// the sake of this example the AI logic is embedded in this processor.
    /// </summary>
    protected override void Process()
    {
        // TODO: Set these as AI system constants.
        const float aiAwarenessRadius = 100f;
        const float idealDistance     = 10f;

        Collider[] colliders = Physics.OverlapSphere(this.profile.Rigidbody.position, aiAwarenessRadius, System.ShooterMask);

        if (colliders.Length == 1)
        {
            return;
        }

        float            closestDistance = Mathf.Infinity;
        ShooterProcessor closest         = null;

        // Find closest shooter.
        for (int i = 0; i < colliders.Length; i++)
        {
            // There are only two colliders, which are direct child of the main instance transform.
            if (colliders[i].transform.parent == this.profile.Transform)
            {
                continue;
            }

            if (!this.worldSystem.WorldInstance.FindShooter(colliders[i].transform.parent, out ShooterProcessor iteration))
            {
                continue;
            }

            // Important note: Shooter's this.profile.Transform.position is always 0,0,0!
            // this.profile.Rigidbody or this.profile.Head hold the true position.
            float distance = Vector3.Distance(this.profile.Rigidbody.position, iteration.Profile.Rigidbody.position);

            if (distance >= closestDistance)
            {
                continue;
            }

            closestDistance = distance;
            closest         = iteration;
        }

        if (closest == null)
        {
            // Roam.
            this.profile.Rigidbody.velocity = new Vector3(UnityEngine.Random.value, 0, UnityEngine.Random.value).normalized *System.MoveSpeed;
            return;
        }

        Vector3 enemyDirection = (closest.Profile.Rigidbody.position - this.profile.Rigidbody.position).normalized;

        this.profile.Rigidbody.velocity = closestDistance >= idealDistance ?
                                          enemyDirection.normalized * System.MoveSpeed :
                                          Vector3.zero;

        // Ready to fire.
        Aim(enemyDirection);
        Shoot();
    }
示例#9
0
    private IEnumerator MoveToPositionRoutine(Vector3 newPosition)
    {
        float startTime = 0;

        float distance = Vector3.Distance(transform.position, newPosition);

        float totalTime = distance / movingSpeed;

        while (startTime < totalTime)
        {
            transform.position = Vector3.Lerp(transform.position, newPosition, startTime);

            if (transform.position == newPosition)
            {
                isMoving = false;

                yield break;
            }

            startTime += Time.deltaTime;

            yield return(null);
        }

        isMoving = false;
    }
示例#10
0
 private Meme IsCloseEnoughForBreeding(MemeController c)
 {
     return(Vector3.Distance(transform.position, _target.transform.position) <
            1
         ? Memes["Breed"]
         : null);
 }
示例#11
0
        private IEnumerator AttackCoroutine(GameObject player)
        {
            while (true)
            {
                var currentPosition = transform.position;
                var targetPosition  = player.transform.position;
                var totalDistance   = Vector3.Distance(currentPosition, targetPosition);
                var t = totalDistance / _chargeSpeed;

                _sequence = DOTween.Sequence();
                _sequence.AppendCallback(() => _collider.enabled = false);
                _sequence.Append(transform.DOMove(targetPosition, t).SetEase(Ease.Linear));
                _sequence.AppendCallback(() => TryDoDamage(player));
                _sequence.Append(transform.DOMove(currentPosition, t).SetEase(Ease.Linear));
                _sequence.AppendCallback(() => _collider.enabled = true);
                _sequence.Play();

                while (!_sequence.IsComplete())
                {
                    var currentDistance = Vector3.Distance(transform.position, currentPosition);
                    _animator.SetFloat(_attackStateAnimationHash, currentDistance / totalDistance);
                    yield return(null);
                }

                yield return(new WaitForSeconds(_attacksInterval));
            }
        }
示例#12
0
 private Meme IsCloseEnoughForDrinking(MemeController c)
 {
     return(Vector3.Distance(transform.position, _target.transform.position) <
            characteristics.AnimalCharacteristics.EatRange
         ? Memes["Drink"]
         : null);
 }
示例#13
0
    private static void SendTCPDataRadius(int exceptClient, Packet _packet, Vector3 position, float sendRadius)
    {
        //_packet.WriteLength();

        for (int i = 1; i <= GameServer.MaxPlayers; i++)
        {
            if (GameServer.clients[i].player != null)
            {
                if (i == exceptClient)
                {
                    continue;
                }

                Vector3 targetPosition;
                if (GameServer.clients[i].player.data.is_on_ship)
                {
                    targetPosition = GameServer.clients[i].player.transform.position;
                }
                else
                {
                    targetPosition = GameServer.clients[i].player.playerInstance.transform.position;
                }

                float distance = Vector3.Distance(position, targetPosition);
                if (Math.Abs(distance) < sendRadius)
                {
                    /*GameServer.server.Send(GameServer.clients[i].connectionId,
                     *  new List<AsyncTCPServer.Message>() {
                     *      new AsyncTCPServer.Message(1, _packet.ToArray())
                     * });*/
                    GameServer.server.Send(GameServer.clients[i].ipPort, _packet.ToArray());
                }
            }
        }
    }
示例#14
0
 // Update is called once per frame
 void Update()
 {
     if (Giro)
     {
         ruleta.transform.Rotate(Vector3.forward * (RotationSpeed * Time.deltaTime));
         StartCoroutine(girando());
         if (RotationSpeed <= 0)
         {
             Giro = false;
             print("Se detuvo");
             float  dist   = Int32.MaxValue;
             string select = "";
             foreach (GameObject txt in textosObj)
             {
                 if (Vector3.Distance(txt.transform.position, puntero.transform.position) < dist)
                 {
                     dist   = Vector3.Distance(txt.transform.position, puntero.transform.position);
                     select = txt.GetComponent <Text>().text;
                 }
             }
             print("Seleccion -> " + select);
             RotationSpeed = _rotationSpeed;
         }
     }
     else
     {
         RotationSpeed = _rotationSpeed;
     }
 }
示例#15
0
    private IEnumerator TranslateMealToMouth()
    {
        if (!isCollectible)
        {
            yield break;
        }
        _collider2D.enabled = false;
        _rb.bodyType        = RigidbodyType2D.Static;

        while (Vector3.Distance(transform.position, _catMouth.position) > 0.3f)
        {
            transform.position = Vector3.MoveTowards(transform.position, _catMouth.position, _step);
            if (transform.lossyScale.x > 0.8f)
            {
                var mealTransform = transform;
                var scale         = mealTransform.localScale.x;
                scale -= 0.01f;
                mealTransform.localScale = new Vector3(scale, scale, scale);
            }
            yield return(Yielders.FixedUpdate);
        }
        if (!isFreezeEvent)
        {
            OnCollect?.Invoke(gameObject);
            isCollectedEvent.Invoke();
            DestroyObject();
        }
        else
        {
            Reject();
        }
    }
示例#16
0
    private List <int[]> CreateAtomsGraph(Vector3[] atomsPositons)
    {
        List <int[]> ris = new List <int[]>();

        allSolutionAtomsPositions    = new Vector3[atomsPositons.Length + 1];
        allSolutionAtomsPositions[0] = Vector3.zero; // primo posto riservato al pivot
        for (int i = 1; i < allSolutionAtomsPositions.Length; i++)
        {
            allSolutionAtomsPositions[i] = atomsPositons[i - 1];
        }

        for (int i = 0; i < allSolutionAtomsPositions.Length; i++)
        {
            for (int j = 0; j < allSolutionAtomsPositions.Length; j++)
            {
                if (i == j)
                {
                    continue;
                }
                int[] possibleBond = { i, j };
                if (ris.Any(p => p.SequenceEqual(possibleBond)))
                {
                    continue;
                }
                ris.Add(possibleBond);
                distancesGraph.Add(Vector3.Distance(allSolutionAtomsPositions[i], allSolutionAtomsPositions[j]));
            }
        }

        return(ris);
    }
示例#17
0
    void IBattleCharacter.MoveTo(UVector3 position)
    {
        if (!Agent || !Agent.enabled)
        {
            return;
        }
        IsStop = false;
        this.Agent.Resume();
        var pos = position.ToUVer3();

        UnityEngine.AI.NavMeshHit hit;
        if (UnityEngine.AI.NavMesh.SamplePosition(pos, out hit, 10000, this.Agent.areaMask))
        {
            targetPos = hit.position;
        }
        else
        {
            return;
        }

        if (Vector3.Distance(targetPos.Value, this.transform.position) < 0.2f)
        {
            stopMove();
            return;
        }
        this.Agent.SetDestination(targetPos.Value);
    }
    public IEnumerator _chooseTarget()
    {
        float     shortestRange = Mathf.Infinity;
        Transform closestEnemy  = null;

        foreach (Transform enemy in enemiesList)
        {
            float distanceToEnemy = Vector3.Distance(player.transform.position, enemy.transform.position);

            if (distanceToEnemy < shortestRange)
            {
                shortestRange = distanceToEnemy;
                closestEnemy  = enemy;
            }
        }

        if (closestEnemy != null && shortestRange <= shootRange)
        {
            inRange = true;
            target  = closestEnemy.transform;
            firePoint.LookAt(target);
        }
        else
        {
            inRange = false;
            target  = null;
        }
        yield return(new WaitForSeconds(1f));
    }
示例#19
0
    private void FindClosestTarget()
    {
        GameObject[] targets = GameObject.FindGameObjectsWithTag("Creep");

        float      minDistance = Mathf.Infinity;
        GameObject tempTarget  = null;

        foreach (var target in targets)
        {
            float currentDistance = Vector3.Distance(transform.position, target.transform.position);
            if (currentDistance < minDistance)
            {
                tempTarget  = target;
                minDistance = currentDistance;
            }
        }

        if (tempTarget && minDistance <= _stats.AttackRange)
        {
            _target = tempTarget;
        }
        else
        {
            _target = null;
        }
    }
示例#20
0
    PlayerCharacter GetClosestEnemy()
    {
        PlayerCharacter tMin       = null;
        float           minDist    = aggro_range;
        Vector3         currentPos = transform.position;

        foreach (Client client in GameServer.clients.Values)
        {
            if (client.player && client.player.playerCharacter && !client.player.playerCharacter.data.dead)
            {
                PlayerCharacter p = client.player.playerCharacter;
                dist = Vector3.Distance(p.transform.position, currentPos);
                if (dist < minDist)
                {
                    tMin    = p;
                    minDist = dist;
                    ServerSend.NPCTarget(id, p.id, (int)GameObjectType.dragon, transform.position);
                    break;
                }
            }
        }

        if (tMin != null)
        {
            bool ok = NavMesh.CalculatePath(transform.position, tMin.transform.position, NavMesh.AllAreas, path);
            if (path.status != NavMeshPathStatus.PathComplete)
            {
                return(null);
            }
        }
        return(tMin);
    }
示例#21
0
    Option <Unit> NearestObj(V3 pos, out float distance)
    {
        var   nearestObj      = Option.None <Unit>();
        float nearestDistance = 0;

        distance = nearestDistance;
        for (int o = 0; o < objects.Count; o++)
        {
            var obj = objects[o];
            //if ( obj1 != null )
            {
                V3    p    = objects[o].transform.position;
                float dist = V3.Distance(pos, p);
                if (!nearestObj.HasValue)
                {
                    nearestObj      = obj.Some();
                    nearestDistance = dist;
                    distance        = dist;
                    continue;
                }

                if (dist < nearestDistance)
                {
                    nearestObj      = obj.Some();
                    nearestDistance = dist;
                    distance        = dist;
                }
            }
        }
        return(nearestObj);
    }
示例#22
0
    void ChooseNextEnemy()
    {
        PlayerCharacter maxDamageEnemy = null;
        float           maxDamage      = 0;

        foreach (int playerId in playerDamage.Keys)
        {
            PlayerCharacter player = GameServer.clients[playerId].player.playerCharacter;
            if (playerDamage[playerId] > maxDamage && Vector3.Distance(transform.position, player.transform.position) <= chaseRange)
            {
                maxDamage      = playerDamage[playerId];
                maxDamageEnemy = GameServer.clients[playerId].player.playerCharacter;
            }
        }

        if (maxDamageEnemy)
        {
            enemy = maxDamageEnemy;
        }
        else
        {
            enemy = GetClosestEnemy();
        }

        if (enemy != null)
        {
            bool ok = NavMesh.CalculatePath(transform.position, enemy.transform.position, NavMesh.AllAreas, path);
            if (path.status != NavMeshPathStatus.PathComplete)
            {
                enemy = null;
            }
        }
    }
示例#23
0
    private IEnumerator Movement(Transform firstItem, Transform secondItem, SwitchDelegate onSwitched = null)
    {
        var pos1  = firstItem.position;
        var pos2  = secondItem.position;
        var speed = 5f * Time.deltaTime;
        var delay = new WaitForSeconds(0.3f);

        onSwitched = _onSwitched;

        while (true)
        {
            secondItem.position = Vector3.MoveTowards(secondItem.position, pos1, speed);
            firstItem.position  = Vector3.MoveTowards(firstItem.position, pos2, speed);

            // at the end of movement
            if (Vector3.Distance(firstItem.position, pos2) < 0.1f)
            {
                firstItem.position  = pos2;
                secondItem.position = pos1;
                yield return(delay);

                onSwitched?.Invoke();
                Debug.Log("valid");
                yield break;
            }

            yield return(null);
        }
    }
    private void handleZeroPlanetIsoView()
    {
        if (_planetNum != 0)
        {
            return;
        }
        print("planet is 0");
        var dir         = new Vector3(xDisToStar, yDisToStar, zDisToStar).normalized;
        var isoIdealPos = _starPos + dir * _dirMultiplierCam;

        isoStarViewPos.position = isoIdealPos;
        camera.GetComponent <ThirdPersonCamera>().isometricStarViewPos.position = isoIdealPos;

        print("iso position  " + isoIdealPos);
        // move player a little bit closer to the star when first enter iso view
        var dirA = (player.position - _starPos).normalized;
        var playerIsoStartPos = transform.position - dirA * _dirMultiplierPlayer;

        var playerToStarDist = Vector3.Distance(playerIsoStartPos, _starPos);

        if (playerToStarDist > 180)
        {
            playerIsoStartPos = transform.position + dirA * _dirMultiplierPlayer;
        }


        print("playerToStarDist --- " + playerToStarDist);

        player.GetComponent <ThirdPersonPlayer>().playerIsoEnterPos = playerIsoStartPos;
    }
示例#25
0
        private void Update()
        {
            if (_freezeDuration <= 0f)
            {
                var distance  = Vector3.Distance(transform.position, Player.Instance.transform.position);
                var direction = -(transform.position - Player.Instance.transform.position).normalized;

                transform.rotation = Quaternion.LookRotation(direction, Vector3.up);
                _speedMod          = Mathf.Lerp(_speedMod, 1f, Time.deltaTime * 2f);

                if (distance > StopDistance || _speedMod < 0)
                {
                    transform.position += Preset.Speed * Time.deltaTime * direction * _speedMod;
                }
                else
                {
                    DealDamageToPlayer();
                }
            }
            else
            {
                _freezeDuration -= Time.deltaTime;
            }

            PushCloseEnemies();
        }
    private void calculatePerpendicularDir(Vector3 planetOnePos, Vector3 planetTwoPos)
    {
        var dirA = planetOnePos - _starPos;
        var dirB = planetTwoPos - _starPos;

        var normalDir = Vector3.Cross(dirA, dirB).normalized;

        GetComponent <Orbit>().normalVector = normalDir;

        var isoIdealPos = _starPos + normalDir * _dirMultiplierCam;

        isoStarViewPos.position = isoIdealPos;
        camera.GetComponent <ThirdPersonCamera>().isometricStarViewPos.position = isoIdealPos;

        if (!_firstEnter)
        {
            return;
        }
        var playerToStar = Vector3.Distance(player.position, _starPos);

        print("playerToStarDist --- " + playerToStar);

        var playerIsoStartPos = transform.position + dirB.normalized * _dirMultiplierPlayer;
        var playerToStarDist  = Vector3.Distance(playerIsoStartPos, _starPos);

        if (playerToStarDist > 250)
        {
            playerIsoStartPos = transform.position - dirB.normalized * _dirMultiplierPlayer;
        }
        player.GetComponent <ThirdPersonPlayer>().playerIsoEnterPos = playerIsoStartPos;

        _firstEnter = false;
    }
示例#27
0
    private bool CheckMinDistanceApart(Vector3 pos, List <Vector3> spawned)
    {
        if (spawned.Count == 0)
        {
            return(true);
        }
        bool ok    = false;
        var  apart = new List <Vector3>();

        for (int i = 0; i < spawned.Count; i++)
        {
            var dist = Vector3.Distance(pos, spawned[i]);
            Debug.Log(dist);
            if (dist >= minDistanceApart)
            {
                apart.Add(spawned[i]);
            }
        }
        if (apart.Count < spawned.Count)
        {
            for (int i = 0; i < spawned.Count; i++)
            {
                if (!apart.Contains(spawned[i]))
                {
                    spawned.RemoveAt(i);
                }
            }
        }
        return(ok);
    }
示例#28
0
    public Vector3Int FindNearestLocalPoint(Vector3 worldPoint, Block target)
    {
        var targetPos = MyGrid.FirstOrDefault(x => x.Value.Equals(target)).Key;
        List <Vector3Int> adjacentPoints = GetAdjacentPoints(targetPos);

        foreach (var point in adjacentPoints)
        {
            if (MyGrid.ContainsKey(point))
            {
                adjacentPoints.Remove(point);
            }
        }

        float      minimumDistance   = float.MaxValue;
        Vector3Int closestLocalPoint = new Vector3Int();

        foreach (var point in adjacentPoints)
        {
            var adjacentWorldPoint = ConvertLocalToWorldPoint(point);

            if (Math.Min(minimumDistance, Vector3.Distance(adjacentWorldPoint, worldPoint)) != minimumDistance)
            {
                closestLocalPoint = point;
                minimumDistance   = Math.Min(minimumDistance, Vector3.Distance(adjacentWorldPoint, worldPoint));
            }
        }

        return(closestLocalPoint);
    }
    public static float CalculateDistance(Vector3 leftOriginLocal_mm, Vector3 leftDirection, Vector3 rightOriginLocal_mm, Vector3 rightDirection)
    {
        Vector3 p1;
        Vector3 p2;

        var linesAreNotParallel = ClosestPointsOnTwoLines(out p1, out p2, ref rightOriginLocal_mm, ref rightDirection, ref leftOriginLocal_mm, ref leftDirection);

        var combinedGazeOrigin_mm = (leftOriginLocal_mm + rightOriginLocal_mm) / 2f;
        var convergencePoint      = (p1 + p2) / 2f;

        var distance_mm = Vector3.Distance(convergencePoint, combinedGazeOrigin_mm);

        if (float.IsNaN(distance_mm))
        {
            return(_lastDistance_mm);
        }

        if (!linesAreNotParallel || distance_mm > _maximumDistance_mm || float.IsInfinity(distance_mm))
        {
            distance_mm = _maximumDistance_mm;
        }

        if (distance_mm < _minimumDistance_mm)
        {
            distance_mm = _minimumDistance_mm;
        }

        _lastDistance_mm = distance_mm;

        return(distance_mm);
    }
示例#30
0
    protected void Hearing()
    {
        // If the bee is heading towards the hive, don't interrupt
        if (mainTarget != null && mainTarget.gameObject == hive.gameObject)
        {
            return;
        }

        // If the noise maker is not set
        if (playerNoiseMaker == null)
        {
            player           = GameObject.FindGameObjectWithTag("Player");
            playerNoiseMaker = player.GetComponent <NoiseMaker>();
        }

        // If we did not fail to find the player's noise maker
        if (playerNoiseMaker != null)
        {
            // If we're close enough to hear the player
            if (Vector3.Distance(player.transform.position, transform.position) <= playerNoiseMaker.volume + hearingRadius)
            {
                HearPlayer(player);
            }
        }
    }