わかりを得た

Unityとかゲーム開発について共有できそうなやつ

ベジェ曲線上にオブジェクトを並べる

昔別の場所で書いたコードを再掲します
ベジェ曲線上にパーツを並べるコードです。

こんな感じ

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[ExecuteInEditMode]
public class eu_bezier : MonoBehaviour {


	public Transform[] controlpoint=new Transform[4];
	public Transform[] g_parts=new Transform[6];

	void Update () 
	{
		
		Vector3[] cp=new Vector3[4];
		for (int k=0;k<4;k++)cp[k]=controlpoint[k].localPosition;


		for (int i=0;i<g_parts.Length;i++)
		{
			float t=i*(1f/(g_parts.Length-1));
			Vector3 pos=Vector3.zero;

			//ベジエ計算
			pos.x=Mathf.Pow(1f-t,3)*cp[0].x+(Mathf.Pow((1f-t),2)*3)*t*cp[1].x+((1f-t)*3)*Mathf.Pow(t,2)*cp[2].x+Mathf.Pow(t,3)*cp[3].x;
			pos.y=Mathf.Pow(1f-t,3)*cp[0].y+(Mathf.Pow((1f-t),2)*3)*t*cp[1].y+((1f-t)*3)*Mathf.Pow(t,2)*cp[2].y+Mathf.Pow(t,3)*cp[3].y;


			//サインカーブでうねらせる場合
			pos.x+=Mathf.Sin((Time.time-(0.1f*i))*5)*0.1f;
			pos.y+=Mathf.Cos((Time.time-(0.1f*i))*8)*0.1f;


			g_parts[i].localPosition=pos;
		}	
	}
}

controlpointにコントロールポイントの空オブジェクトを4つ、
g_partsに並べたいTransformを好きなだけ入れます。
コントロールポイントを動かすと並べられます。あとは流れで

計算式はどっかで読んだのの受け売り……
この書き方だと曲線の真ん中に行くほどオブジェクトの間隔が詰まっていき、端の方は疎になるというデメリットがあります。
曲線上に均等に並べるにはどうしたらいいんだろ……
誰かアドバイス頂ければうれしいです。

過去のテキストコーナーに置きっぱなしのコードがいくつかある(俺も忘れてた)ので
再掲エントリーが続くと思います。
よろしう