うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】円周の位置を取得する

using UnityEngine;

public static class CircleUtil
{
    /// <summary>
    /// 円周の位置を取得する
    /// </summary>
    public static Vector2 GetCirclePosition(float angle, float radius)
    {
        return GetCirclePosition(angle, radius, radius);
    }

    /// <summary>
    /// 円周の位置を取得する xとyの半径別指定
    /// </summary> 
    public static Vector2 GetCirclePosition(float angle, float radiusX, float radiusY)
    {
        return new Vector2(Mathf.Cos(angle * Mathf.Deg2Rad) * radiusX, Mathf.Sin(angle * Mathf.Deg2Rad) * radiusY);
    }   
}

サンプル1

f:id:hacchi_man:20200312235215g:plain

using UnityEngine;

public class SampleMonoBehaviour : MonoBehaviour
{
    [SerializeField]
    private Transform _center;

    [SerializeField]
    private Transform _target;

    [SerializeField, Range(0, 360)]
    private float _angle;
    
    [SerializeField]
    private float _radius = 1f;
    
    private void OnValidate()
    {
        if (_center == null || _target == null)
            return;
        
        var pos = CircleUtil.GetCirclePosition(_angle, _radius);
        var cpos = _center.transform.position;
        cpos.x += pos.x;
        cpos.y += pos.y;
        _target.transform.position = cpos;
    }
}

サンプル2

f:id:hacchi_man:20200313000103g:plain

using UnityEngine;

public class SampleMonoBehaviour : MonoBehaviour
{
    [SerializeField]
    private Transform _center;

    [SerializeField]
    private Transform _target;

    [SerializeField, Range(0, 360)]
    private float _angle;
    
    [SerializeField]
    private float _radiusX = 1f;
        
    [SerializeField]
    private float _radiusY = 1f;
    
    private void OnValidate()
    {
        if (_center == null || _target == null)
            return;
        
        var pos = CircleUtil.GetCirclePosition(_angle, _radiusX, _radiusY);
        var cpos = _center.transform.position;
        cpos.x += pos.x;
        cpos.y += pos.y;
        _target.transform.position = cpos;
    }
}