Example #1
0
    // Update is called once per frame
    void LateUpdate()
    {
        if (!isDetectionFrame || m_manageTerritory.territoryPoints == null)
        {
            return;
        }

        SetHitFlags(CollisionTerritory.HitLineTerritory(m_manageTerritory.territoryPoints, transform.position, m_cHitDistance, -m_radius));
    }
    /// <summary>
    /// [CheckTerritory]
    /// テリトリーの当たり判定を行う
    /// </summary>
    void CheckTerritory(ref Vector3 position)
    {
        //ヒット計算
        bool isResult = CollisionTerritory.HitCircleAndRayTerritory(
            m_playerInfo.territorialArea, position, out m_territoryForwardSideNormall, m_collisionRadius);

        //フラグ判定
        isTerritoryEnter = (isTerritoryStay ^ isResult) & isResult;
        isTerritoryExit  = (isTerritoryStay ^ isResult) & isTerritoryStay;
        isTerritoryStay  = isResult;
    }
    /// <summary>
    /// [HitCircleTerritory]
    /// PlayerのテリトリーエリアとXZ円で当たり判定を行う
    /// 引数1: Player object->GetInstanceID()
    /// 引数2: Circle position
    /// 引数3: Circle radius
    /// </summary>
    public bool HitCircleTerritory(int playerID, Vector3 position, float radius)
    {
        //debug only, invalid key対策
#if UNITY_EDITOR
        if (!m_players.ContainsKey(playerID))
        {
            Debug.LogError("Error!! PlayerAndTerritoryManager->HitCircleTerritory\n ContainsKey(instanceID) == false");
            return(false);
        }
#endif

        return(CollisionTerritory.HitCircleTerritory(
                   m_players[playerID].playerInfo.territorialArea, position, 100.0f, -radius));
    }
    /// <summary>
    /// [RaycastTerritory]
    /// PlayerのテリトリーエリアとXZでRaycast判定を行う
    /// 引数1: Player object->GetInstanceID()
    /// 引数2: Ray position
    /// 引数3: Ray direction
    /// 引数4: Ray distance
    /// 引数5: Ray normal (out)
    /// </summary>
    public bool RaycastTerritory(int playerID, Vector3 position, Vector3 direction, float distance, out Vector3 normal)
    {
        //debug only, invalid key対策
#if UNITY_EDITOR
        if (!m_players.ContainsKey(playerID))
        {
            Debug.LogError("Error!! PlayerAndTerritoryManager->GetServant\n ContainsKey(instanceID) == false");
            normal = Vector3.zero;
            return(false);
        }
#endif

        return(CollisionTerritory.HitRayTerritory(m_players[playerID].playerInfo.territorialArea,
                                                  position, direction, distance, out normal));
    }
Example #5
0
    void LateUpdate()
    {
        if (!isDetectionFrame || m_manageCommander == null)
        {
            return;
        }

        if (m_manageCommander.isLinked)
        {
            if (!m_isLinkedMode)
            {
                hitCommander   = CommanderManager.instance.GetCommanderObject(m_manageCommander.gameObject);
                m_isLinkedMode = true;
            }

            SetHitFlags(CollisionTerritory.HitLineTerritory(
                            m_manageCommander.manageTerritory.territoryPoints, transform.position, m_cHitDistance, -m_radius));
        }
        else
        {
            m_isLinkedMode = false;
            hitCommander   = default;

            for (int i = 0; i < CommanderManager.instance.commanderCount; ++i)
            {
                var commander = CommanderManager.instance.GetCommanderIndex(i);

                if (commander.isValid)
                {
                    bool result = CollisionTerritory.HitLineTerritory(
                        m_manageCommander.manageTerritory.territoryPoints, transform.position, m_cHitDistance, -m_radius);

                    if (result)
                    {
                        SetHitFlags(result);
                        hitCommander = CommanderManager.instance.GetCommanderObject(m_manageCommander.gameObject);
                        break;
                    }
                }
            }

            if (!hitCommander.isValid)
            {
                SetHitFlags(false);
            }
        }
    }
Example #6
0
    /// <summary>
    /// [UpdateBasePoint]
    /// BasePointの更新を行う
    /// </summary>
    public void UpdateBasePoint()
    {
        //処理インターバル判断
        if (m_intervalTimer.elapasedTime < m_collisionJudgementInterval)
        {
            return;
        }

        //処理負荷軽減
        Vector3 position = transform.position;
        //ヒットしたPlayerのID
        int hitPlayer = -1;
        //Playerにヒットした回数
        int hitCount = 0;

        //当たり判定ループ
        foreach (var e in PlayerAndTerritoryManager.instance.allPlayers)
        {
            //当たったらID保存、カウンタインクリメント
            if (CollisionTerritory.HitCircleTerritory(e.Value.playerInfo.territorialArea, position, m_collisionRadius))
            {
                hitPlayer = e.Value.playerInfo.instanceID;
                ++hitCount;
            }
        }

        //ヒットしていなかったら解除
        if (hitCount == 0 && isLinked)
        {
            UnlinkPlayer();
        }
        //ヒットしていたら登録
        else if (hitCount == 1 && !isLinked)
        {
            LinkPlayer(hitPlayer);
        }
        //ないだろうけど上書きされたら解除->登録
        else if (linkPlayerID != hitPlayer)
        {
            UnlinkPlayer();
            LinkPlayer(hitPlayer);
        }

        //タイマー再スタート
        m_intervalTimer.Start();
    }
Example #7
0
 // Update is called once per frame
 void Update()
 {
     //Debug.Log(CollisionTerritory.HitSegments(Vector3.forward, -Vector3.forward, -Vector3.right, 100));
     Debug.Log(CollisionTerritory.HitLineTerritory(m_territory.territoryPoints, transform.position, 100));
 }