プロフィール

はーさん

Author:はーさん
1人創作チームDeadMan'sSunのボスです。
Twitter→@Ha_Shok_ko

TERA HITO:Revolutionを作りました。よろしく頼むぜ、兄弟!
・ふりーむ!のTERAのページ(exe形式公開場所)へ
・UnityRoomのTERAのページ(WebGL版公開場所)へ

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム
QRコード
QR

私のアイランド


--/--/-- --:-- はーさん

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2015/08/15 21:10 はーさん

Unityでサインコサインの話を使って円形にユニットを並べる


はてさてはてさてやってまいりました。
おおよそ二、三週間ぶりといっても過言ではないブログの更新です。
だいたいテスト勉強ですね。いや、正直テスト勉強だけじゃなくてLoLも結構アレですけど。
あと友達と遊びに行ったりとか。

で、今日はUnityでのSin、Cos、Tanを使っていて気付いたこととかを話します。
いつものことながらメモ書きですが。

■Mathf関数の話

円形に何かを配置するときや、敵の周りを回転しながら動いたりさせたいときがあると思います。
そういうときは、調べたらなんかMathf.SinとかCosを使う、ってのが出てくるんですよね。
で、まぁ実際使うわけですけども。

たとえば角度30度のときのSinの値がほしい!ってなったら

Mathf.Sin(30)

みたいに書いちゃう人って、わりといると思います。
いないですかね?僕はこう書いて失敗しまくりました。

このMathf.SinとCosの引数の値ってラジアン値なので、普通に角度入れてもダメなんですよね。
高校数学は常に30点前後を行き来していた僕なので、詳しい原理はおいといて、どうやって使うのが良いのかを書きます。

僕が作ったのは以下のコード。
やってることはピクミンみたいに何かの周りを取り囲むようにキャラを動かすために、キャラの移動地点を作ってあげて、その地点の情報を構造体の中に入れています。
構造体には座標と、配置可能か否かの情報を保存します。

public struct position{
  public Vector3 point;
  public bool setOk;//trueで設置可能.falseで設置不可.
}
public position[] unitsPoint=new position[35];

void setPoint(position[] unitPoint){
Vector3 point = this.gameObject.transform.position;//←取り囲む対象の座標。これを基点に座標を作ります。
int countUnit = 0;//←配置が完了した座標の数。
float theta = 360 / focusUnitSize;//←基準となるθ値を設定。取り囲める最大数で割ってます。
float x = 0f;
float z = 0f;
int size = focusUnitSize;//←取り囲める最大数

while(countUnit   float degree=theta*countUnit;//←カウント数に応じてθ値を増加させていきます。
   float radian=Mathf.PI/180*degree;//←radian値を求めます。
   x=Mathf.Cos(radian)*radius;//Mathf.SinとCosの引数はRadian値です。これに半径をかけて値を調整します。
   z=Mathf.Sin(radian)*radius;
   Vector3 positon=new Vector3(point.x+x,0f,point.z+z);//座標を作ります
   unitPoint[countUnit].point=positon;//構造体に新しい地点を設定
   unitPoint[countUnit].setOk=true;//構造体にこの地点は設置可能である情報を格納
   countUnit++;//値を増やして次の座標設定へ
  }
}

これを使って色々(ユニットが対象を選べば設定した近くの座標へ行くように命令を出してやる)やったらこういう風に。





以下コードの引数とかの話。

・theta
角度。ここでは周りを取り囲みたいので基準の角度を設定しました。
360度を取り囲めるユニットの最大数で割ってやってから、while文で増加させて座標をズラしています。

・radian
ラジアンです。
360度を基準にした値で、こういう具合の対応関係のようです。

360=2π
180=π
90=π/2
45=π/4
1=π/180

とりあえず、角度θだけではMathf関数を上手く使えないので、θをRadianに直してあげます。
ラジアン値はMathf.PIを使って、そいつを180で割ってから角度を与えています。

radian=Mathf.PI/180*角度

ちなみに、このradianを角度に戻すには

radian/(Mathf.PI/180)

こんな感じ。

※このコードでは角度はdegreeで、theta*countUnitです。

・Mathf.Sin、Cos
Mathf.SinとCos等はtheta値を引数にするとおかしなことになります。
数字を引数にしているので別に30度とか60度入れても動くんですけど、radian値を入れてくれること前提みたいなので変な値を返してきます。
MathfとMathの違いですけど、fってついてるほうがfloat値が返却値になっててMathのほうはDouble値とかだった気がします。
両方とも返却値が違うだけで、中身は一緒です。
両者とも引数をradianとして計測して、それを返しています。
半径を1として計測しているので、この値に半径をかけてやることで、半径に応じた値を得ることができます。

使い方はこういう具合。

Mathf.Sin(Radian値)*任意の半径

Mathf.Cos(Radian値)*任意の半径

※radian値は先に書いたとおりです。

今回はxとz座標を変えたかったので、yをzにしています。
なんでかというと、単位円を考えると

picture

Xの値=cosθ
Yの値=sinθ

で求めることができるからです。
なのでyをzとして考えて、値を変えました。
理屈は覚えてませんけど、とりあえず使えるので良いかな!って感じです。


============================================

なんだかわりと訪問者が途切れることなくやってくるので、やはりUnity関係って需要あるんだなぁ、と常々思いました。
また何かあったら書きます。

おかしいところとかあったら教えていただけるとうれしいです。
スポンサーサイト
【Unity】RTSみたいなゲームオブジェクトの選択方法 | ホーム | UnityのVector3.angleの話+継承とusingの違い
Comment


Trackback
この記事のトラックバックURL
http://watasinoilands.blog.fc2.com/tb.php/53-c55c57cb
この記事にトラックバックする(FC2ブログユーザー)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。