プロフィール

はーさん

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

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

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

私のアイランド


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

スポンサーサイト

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

UnityのVector3.angleの話+継承とusingの違い


またコメントをもらいました。
ありがとうございます。もっと早くにブログで色々書けばよかった・・・

> 継承はびっくりするほど関係ないよ。
> UnityEngine.UI.Imageって書くのが面倒だから省略できるようにするのがusing。
> だからugingの行を消して全部のImageにUnityEngine.UI.って書いても動くよ。

ほえぇ~・・・初耳でした。
つまり両者は

using宣言→「~っていう機能を使うときに、普通に書くと大変だから楽するよ。」宣言
継承→「別に作ってある○○ってヤツの持ってる関数とか変数を使わせてもらうよ。」宣言

こういう感じなのでしょう。
こう考えると、確かに全然関係ありませんね。
継承することは他のところから機能(関数)を引っ張ってくることってイメージだったんで、この宣言を使って初めて色々使えるもんだと思っていました。勘違いはーさんでございました。wrongHasan.

また1つ知恵を得ました。ありがとうございます。






さて、今回はゴリ押しまでの過程の話です。

戦車の砲塔は塔と砲身のセットでございます。
塔を回して、砲身を上下させる。

せっかく有料アセットを買ったのでやりてぇ!リアルな挙動を作りてぇ!そう思った調査団は捜査に乗り出した・・・

えーと、まず僕はこう考えました。

砲塔部分と砲身部分を分けて、砲身を砲塔の子オブジェクトにさせて、砲塔と敵キャラクターの座標を使って二点間の向きとか角度をこう・・・Unityの力で良い感じに取り出して、それを砲身のrotation.xにぶち込んでやる作戦を考えました。

そこで、何か二点間の角度や向きをとれるものはないものか、と探していると出会いました。

Vector3.angle()

Unityってホントなんでもありますね。
二点間の距離から角度、みたいな調べ方したら出てきました。

この関数は引数が二つ存在します。
Vector3.angle(a,b);

aはfrom。どこから、か。
bはto。どこへ、か。

このaからbの距離から、角度を求め・・・るのではなく。
どうも、この関数は、二点のベクトルが作る角度を求めるものらしい。
しかもこの角度、0~180度の間でとる。あとベクトルの大きさは、向きだけを見るので考慮しない・・・っぽい。
角度が0~180度の間、ということもあって座標の値の+とか-は別に考慮しないらしい。

「aとbのベクトル、この二つのベクトルが作る角度はなんぼですか?」コレを求めるもののようである。

この関数はベクトルの向きを考えるので出発点となるaは、出発点のオブジェクトのforwardをとってあげないとちゃんと角度をとってくれませんでした普通のTransform.positionを入れるとあらぬ方向を向いて大変なことに。
コレは恐らくベクトルの向きを見るんで、三次元座標を向きとして扱うのは正面方向とは違うものなんでしょうね。

さらにbに入れるどこまでか、に関してもそのまんま対象のオブジェクトの座標を入れてもダメだった。
対象の座標から出発点の座標を引いた差を使ってあげないと、これもまた座標が一定の値を超えたりするとあらぬ値を取得した。
対象の座標そのまんまじゃなくて、「対象-出発点」としてあげて、二点間の差のベクトルをとってあげてから、正面方向と差のベクトルの成す角度を取得する、って感じじゃないとちゃんと二つのオブジェクトの向きとその角度を求めれないって感じですかね。

数学あんまり分からないので憶測が多いですけど。

使い方的には・・・

//targetPositionには目標の座標を入れます
Vector3 start = transform.TransformDirection(Vector3.forward);
Vector3 target = targetPosition-this.transform.position;
Vector3.angle(start,target);

こんな感じ。
これで二つのオブジェクトの座標から、ベクトルが成す角を求めることができます。

とりあえず、欲しかったものとぜんぜん違いました。



なので、僕は強行手段に出ました。
砲身を敵のいる位置にあわせて上下させる方法を。

そう・・・そいつは・・・

LookAt()

です。

強行手段の手順はこうです。

①LookAt()関数で、砲身を標的ほうへ向かせる。
②しかしLookAt()はyとかzも動くので、砲塔の動きに合わせて、砲身がめっちゃ動いちゃう。
③なので砲身のtransform.rotationをいじって、yとzを常に0にして、x軸だけ動かしちゃおう。


本当なら砲身を敵の位置に合わせて上下なんかはMathfでcosだのなんだの内積がうんぬんかんぬんでやるんでしょうけども。
ですが、ここはUnity。せっかく使えるんですから、使わせてもらいます。
LookAt()実行後のtransform.rotationを求めて、Quartanion型の変数を作って、そこに格納。
そして、変数からyとzをドット技法で個別で変更。
あとは変更したものを砲身のrotationにぶちこんで終わりです。

ずいぶんと回りくどいやり方なんですけど、Transformの、ハマりポインツのせいなんですよね。

たとえば・・・

Transform.position.x=1f;

これはエラーを吐きます。
UnityはTransformの値X,Y,Zを個別で直接変えることを許してくれません。
なので、こんな具合にしてあげます。

Vector3 tpos=transform.position;
tpos.x=1f;
transform.position=tpos;

これで、transformのpositionのxだけを、1に変えることができます。
ほかのtransformの要素も同じように、個別で変えたかったら変数を作って、そこに格納して、ドット技法なりを使って変えてからtransformへ返してあげる、といった感じです。

transformのpositionはVector3型です。
で、rotationはQuaternion型です。
ScaleはVector3型です。
大きさはベクトルの長さで表しているのでしょうか。


最近の収穫はこんな感じです。
また何かあったら書いておきます。
スポンサーサイト
Unityでサインコサインの話を使って円形にユニットを並べる | ホーム | UnityでHPメーターみたいなものを作った話続編
Comment


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