Пример #1
0
    // 磁力の範囲に入った時に呼ばれる
    public override void OnCircleTrigger2D(PoleArea mine, PoleArea other)
    {
        if (m_pole == Pole.None)
        {
            return;
        }
        if (other.m_poleObject.m_pole == Pole.None)
        {
            return;
        }
        if (m_type == Type.NoMove_Change || m_type == Type.NoMove_NoChange)
        {
            return;
        }

        Vector2 dir      = other.transform.position - mine.transform.position;
        float   distance = dir.magnitude;
        float   border   = mine.m_radius + other.m_radius;

        if (border <= 0.0f)
        {
            return;
        }

        Vector2 forceDir;

        forceDir = (m_pole == other.m_poleObject.m_pole) ? -dir : dir;

        Vector2 add = forceDir.normalized * (1.0f - distance / border);

        AddPoleForce(add);
    }
Пример #2
0
    // 磁力の範囲に入った時に呼ばれる
    public override void OnCircleTrigger2D(PoleArea mine, PoleArea other)
    {
        if (m_pole == Pole.None)
        {
            return;
        }
        if (other.m_poleObject.m_pole == Pole.None)
        {
            return;
        }

        Vector2 dir      = other.transform.position - mine.transform.position;
        float   distance = dir.magnitude;
        float   border   = mine.m_radius + other.m_radius;

        if (border <= 0.0f)
        {
            return;
        }

        // レイキャストを当たったオブジェクトの方向に飛ばす
        // 何でもいいので最初に衝突したコリジョンの法線の方向に力を加える
        RaycastHit2D[] castHit;
        RaycastHit2D?  result = null;

        castHit = Physics2D.RaycastAll(mine.transform.position, dir.normalized, distance);
        foreach (var hit in castHit)
        {
            if (transform == hit.collider.transform.parent)
            {
                continue;
            }
            if (result.HasValue)
            {
                if (result.Value.distance > hit.distance)
                {
                    result = hit;
                }
            }
            else
            {
                result = hit;
            }
        }
        if (!result.HasValue)
        {
            return;
        }

        Vector2 forceDir;

        forceDir = (m_pole == other.m_poleObject.m_pole) ?
                   result.Value.normal :
                   -result.Value.normal;

        Vector2 add = forceDir.normalized * (1.0f - distance / border);

        AddPoleForce(add);
    }
Пример #3
0
    // インスペクターが変更せれると呼ばれる
    protected void OnDrawGizmos()
    {
        PoleSprite[] sprites = GetComponentsInChildren <PoleSprite>();
        foreach (var s in sprites)
        {
            s.PoleChange(this);
        }

        PoleArea area = GetComponentInChildren <PoleArea>();

        if (area)
        {
            area.Gizomos(this);
        }
    }
Пример #4
0
    private void OnTriggerStay2D(Collider2D collision)
    {
        if (!collision.isTrigger)
        {
            return;
        }
        PoleArea otherArea = collision.GetComponent <PoleArea>();

        if (!otherArea)
        {
            return;
        }

        m_poleObject.OnCircleTrigger2D(this, otherArea);
    }
Пример #5
0
    public override void OnStart()
    {
        base.OnStart();

        m_poleSprites = GetComponentsInChildren <PoleSprite>();
        foreach (var s in m_poleSprites)
        {
            s.PoleChange(this);
        }

        m_poleArea = GetComponentInChildren <PoleArea>();
        if (m_poleArea)
        {
            m_poleArea.SetPoleObject(this);
        }
    }
Пример #6
0
 public virtual void OnCircleTrigger2D(PoleArea mine, PoleArea other)
 {
 }