コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】CircleCollider2D に Physics2D.Raycast した時に当たった点の反対側の点を取得する方法

ソースコード

public static Vector2 GetRayExitThroughCircle( CircleCollider2D circleCollider, Vector2 entryPoint, Vector2 direction )
{
    Vector2 colliderCenter    = circleCollider.transform.position;
    Vector2 directionToCenter = colliderCenter - entryPoint;

    float angleTowardsCenter    = Vector2.Angle( direction, directionToCenter );
    float angleTowardsExitPoint = 180 - ( angleTowardsCenter + angleTowardsCenter );

    if ( Vector3.Cross( direction, directionToCenter ).z < 0 )
    {
        angleTowardsExitPoint *= -1;
    }

    Vector2 directionToExitPoint = Quaternion.Euler( 0, 0, angleTowardsExitPoint ) * directionToCenter;
    Vector2 exitPoint            = colliderCenter + ( -directionToExitPoint.normalized * circleCollider.radius );

    return exitPoint;
}

使用例

using UnityEngine;

public class Example : MonoBehaviour
{
    public CircleCollider2D m_collider2D;

    private void OnDrawGizmos()
    {
        var position  = transform.position;
        var direction = transform.up;
        var distance  = 1000;
        var hit       = Physics2D.Raycast( position, direction, distance );
        var point     = GetRayExitThroughCircle( m_collider2D, hit.point, direction * distance );

        Gizmos.color = Color.blue;
        Gizmos.DrawRay( position, direction * distance );
        Gizmos.color = Color.red;
        Gizmos.DrawSphere( point, 0.2f );
    }

    ...

f:id:baba_s:20200119193000g:plain

参考サイト様