【3Dゲームエンジン】Unity質問スレッド32
レス数が950を超えています。1000を超えると書き込みができなくなります。
フリー版で開発したゲームは個人・法人を問わず追加のロイヤリティーなしで販売できます。
プラットフォームサポートはiPhone/iPod Touch/iPad、Mac、PC、Web、Wii、Xbox360、Android、PlayStation 3、PlayStation 4、PS Vita他
次スレは>>950以降にできるだけ早く(できれば回答者が回答した後にでも余裕を持って)建てて下さい。
■Unity 2ch Wiki(まとめ、過去ログ、リンク集)
http://www24.atwiki.jp/unity2ch/
●リンク
・Unity(日本公式サイト)
http://unity3d.com/jp
・マニュアル
http://docs.unity3d.com/ja/current/Manual/index.html
・チュートリアル
http://unity3d.com/jp/learn/tutorials
・スクリプトリファレンス
http://docs.unity3d.com/ja/current/ScriptReference/index.html
・FAQ
http://unity3d.com/jp/unity/faq
・MSDN
http://msdn.microsoft.com/ja-jp/ms348103←スクリプトのエラー番号をこれで検索すると原因が日本語で出てきます。
前スレ
【3Dゲームエンジン】Unity質問スレッド31
https://mevius.5ch.net/test/read.cgi/gamedev/1504366121/ transform.lossyscale.x = transform.parent.locssyScale.x * transform.localscale.x
じゃないのか? >>853
そうですね。
parentがrootとは限らないので、parentのlossyscaleじゃないとダメですね。
末枝側へ変換が累積していきますから。
親オブジェクト-子オブジェクトの2者関係だと、
親オブジェクトのlossyscale = localscaleなので、両方localscaleで大丈夫ですけど。
親オブジェクト-子オブジェクト-孫オブジェクトの3者関係だと、
孫オブジェクトの親オブジェクトである子オブジェクトのlossyscaleは、
親オブジェクトのlocalscale * 子オブジェクトのlocalscaleになってますから、
孫オブジェクトのlossyscale
= 子オブジェクトのlossyscale * 孫オブジェクトのlocalscale
= (親オブジェクトのlossyscale * 子オブジェクトのlocalscale) * 孫オブジェクトのlocalscale
= 親オブジェクトのlocalscale * 子オブジェクトのlocalscale * 孫オブジェクトのlocalscale
>>852
仕事じゃなくて学問の方で。
うっかりしてましたが、UnityはCamelCaseだから、localScale,lossyScaleが正しいのでしたね。 Scaleの積は、Vector3の各成分とVector3の各成分の積なので、
Vector3 * Vevtor3 は定義されていないから、
Vector3.Scale(Vector3, Vevtor3) という演算ですね。
いわゆる、アダマール積(シューア積,要素積)です。
Unityでは、アダマール積の逆関数が定義されていないので、
自分でVector3.Scaleの逆関数を定義するか、
アダマール積の逆数を自分で定義する必要がありますね。 Vuforiaを使ってAR作りたいのですが実行するとマーカーは認識するもののカメラの映像が映らずに画面が黒くなります
誰か分かる方いらっしゃいますか...? >>857
専門学校出身だったら行列の回転だとかをQuaternionとかでも適用して使えるんだろなー
という煽りレス plus一ヶ月契約でもエッセンシャルパック2つってもらえますか?
あるいは契約し続けないと使えなくなる感じかな >>858
Unityって、もともと回転行列じゃなくて、クォータニオンで回転しているんじゃないの?? >>860
Matrix4x4というのがあってね...
でも正直に言おう アレは何だ?! 数学難しいですね
でも大丈夫!UNITYにはアセットが有りますよ!
アセットを購入しましょう! >>859
契約切れても有効だけどそもそもplus/pro自体12ヶ月継続必須だから前提が無理 >>861
3次元のベクトルを回転させるのに、なんで4x4行列なの?
回転行列って、3x3行列じゃないの?? >>865
移動と回転とスケーリングができるように、
アフィン変換行列になっているからです。
Matrix4x4.TRS(position, rotation, scale)
で4×4行列に入力できますが、
出力する時は、
Vector3 = Matrix4x4.MultiplyVector(Vector3)
によって、Vector3で入力して、
Vector3で出力できるようになっています。 >>858
回転行列MでベクトルV0を回転させて、ベクトルVにするには、
Z軸で30度回転する場合は、
Quaternion Q = Quaternion.Euler (0, 0, 30);
Matrix4x4 M = Matrix4x4.TRS (Vector2.zero, Q, Vector2.one);
Vector3 V0 = new Vector3(1, 2, 3);
Vector3 V = M.MultiplyVector (V0);
これを、QuaternionとVector3の演算で行うと、
Quaternion Q = Quaternion.Euler (0, 0, 30);
Vector3 V0 = new Vector3(1, 2, 3);
Vector3 V = Q * V0; Matrix4x4 M = Matrix4x4.TRS (Vector2.zero, Q, Vector2.one);
は間違いで、
Matrix4x4 M = Matrix4x4.TRS (Vector3.zero, Q, Vector3.one);
が正しいです。 >>858
Quaternion QでベクトルV0を回転させて、ベクトルVにするには、
Z軸で30度回転する場合は、
Quaternion Q = Quaternion.Euler (0, 0, 30);
Vector3 V0 = new Vector3(1, 2, 3);
Quaternion Qv0 = Quaternion.identity;
Qv0.Set(V0.x, V0.y, V0.z, 0);
Quaternion Qv = Q * Qv0 * Quaternion.Inverse (Q);
Vector3 V = new Vector3(Qv.x, Qv.y, Qv.z);
こちらが、本来のQuaternion積でベクトルを回転させる方法です。
Unityでは、この面倒くさいQuaternion積の演算が、
「Quaternion * Vector3」だけでできるようになっています。 Vector3 = Quaternion * Vector3
は、行列積を意識していると思われます。
Vector3 = Matrix3x3 * Vector3
としたいところですが、
UnityにはMatrix3x3は用意されていません。
(3×3行列の乗算では、回転とスケーリングしかできないからです)
Vector4 = new Vector4(Vector3, 1) で4次元ベクトルにしてから、
Vector4 = Matrix4x4 * Vector4 で計算して、
Vector3 = (Vector3)Vector4 で3次元ベクトルへ戻す必要があります。
最初に、Vector4 = (Vector4)Vector3 と手抜きをしてはいけません。
Vector4 = new Vector4(Vector3, 0) で代入されると、
アフィン変換の「移動」が乗算されなくなります。 行列なんか意識しないでも3dゲーム作れるようになったんだからすごい時代だよね
結構まえからだけど >>864
年契約の1ヶ月払いってだけなんですね
ありがとうございます >>874
半額だったんでplusを年契約の年払いしたよ
売り上げ1千万以上なのに。
たかだか1万円ぐらいを月払いする奴いるの? 物理演算系の解説を希望!
C#の経験あっても、そもそも物理演算は別物な気がする・・・
物理演算は、2Dと3Dで若干仕様が違うし、なかなか体系的に物理演算を解説しているサイトも少ない
せいぜい、velocityとAddForce止まりが多い
重力設定や衝突判定をUnityにまかせてしまうには、物理演算を使用するのが手っ取り早いんだけど、
物理演算だと、これまでのグラフィックス操作的な、プログラミングメソッドがあまり使えない
(基本的に、positionやrotationを直接いじらないほうが良いみたい) アイテムを所持していればお化けを倒せるというシステムにしようと思っています。
それでそのアイテムを十字架の画像にしようと思っているのですが、日本人だったらアイコン見ただけで何となく意味が分かるだろうと思うのですが、海外の人でも抵抗なくスッと理解されるんでしょうか? >>878
海外のゲームを参考にすればわかりますよ >>878
ゲームデザインにもよるけど
そのアイテムの効果とお化けとの相互関係が分かるような物なら多分大丈夫かなぁ アイテム説明とかも結構重要だけども。 アイテム説明が一番確実だわな
むしろ必須じゃないか? transform.LookAtだと、どうしてもオブジェクトのforward軸が対象を向いちゃう
そうじゃなくて、オブジェクトのup軸を対象に向けたいんだけど、一体どうすれば・・・?
transform.LookAtでオブジェクトのforward軸を対象に向けて、
その後にtransform.Rotateでx軸で90度して、up軸をforwardへ向けているんだけど、
2段階になっちゃって、無駄が多いし、その瞬間動作が表示されちゃう
オブジェクトとtransform軸の対応を変更できれば、
オブジェクトのup軸方向を、forward軸に設定したいんだけど・・・ おぶじえくを最初から傾けておくか、小オブジェクトで対応するか、いくらでも方法あるだろうね。
ルックアット使わずにやるのも有りだし。 >>883
目標の座標をVector3 targetとすると、
transform.right = targetでいけませんか?
transform.LookAt(target) は、
transform.forward = target と同じになるはずです。 もっとも汎用性のある方法は、
向き(transform.rotation)を、
向けたい軸(Vector3.right)を向かせたい相手(target)へ向ける回転
Quaternion.FromToRotation にしてしまう方法かと思います。
transform.rotation = Quaternion.FromToRotation(Vector3.right, target)
になります。
例えば、左側をtargetに向けたい場合、
Vector3.right を、- Vector3.right に変更します。
(Vector3.right = - target でも勿論できます)
ただ、Vector3.oneをtargetに向ける回転は、
transform軸への代入ではできず、
上記の汎用法を使うのが良いと思います。 >>883
読み間違えました。
up軸を向けるのでしたね。
@transform.up = target
Atransform.rotation = Quaternion.FromToRotation(Vector3.up, target) 先生、お元気ですか?
ゲームの世界は感覚的すぎて戸惑います。
学び舎では多くを教わりましたが、教わった通りに自分が成長できているか分かりません。
ぼくは、自分の理想の世界観を語れるほどゲームを知らないということを知りました。
惹かれます。
ゲームを、もっと知りたいです。 >>888
どこかで見た文章だけど、元ネタが思い出せない・・・ >>882
文字で説明しないと伝わらないUIはデザインとしてゴミ以下 質問です
友人がウインドウズで9人対9人のオンラインゲームを作りたいと言ってます
それはつまり18人がオンライン接続してゲームするわけですが
そんなことUnityでやれますか? Unityは出来るけど彼らには出来ない
悲しいけどこれ、ゲーム制作なのよね 無料で利用できる範囲は同時接続20人まで
21人〜50人まで月額4200円
51人〜200人まで月額15000円 パーソナル版の使用条件として収益が〜ドル以下みたいな規約がありますが、
あれは自己申告なのでしょうかそれとも向こうでも逐一判断できる状態なんでしょうか。 >>896
判断できる状態ってどんな状態?
自己申告だけどものすごく稼いでたら嫌でも目に留まる 「人生はゲームのようにプレーしろ。真理は恐ろしいものではない。」 >>887
>up軸を向ける
up軸を相手に向けるというのが、当方にはどんな状態なのか、ピンとこないです。
具体的には頭のてっぺんを相手に向けるということなのですか?
それはどんなシチュエーションのゲームなんだろう?
これから相手に頭突きをかますとか?それなら、頭だけを下げればいいわけだし・・・
申し訳ないが、まるで映像が浮かんできません・・・www 落ちものパズルを作成していて画面上部にオブジェクトを出現させて横軸のマウスの動きについてきてクリックでオブジェクトが落下。
というような仕様にしたいのですが、ランダムにオブジェクトを作成して画面上部に固定というのが出来ません。これの解決法が見つかりません。。。
どうかご教授お願いします。 例えば、太陽を中心に地球が公転をする時のようなイメージで、
常に同じ面(赤道面)を太陽に向けて公転する場合は、forwardを太陽に向かせればよいけど、
太陽の真上に北極星をおいて、北極側の地軸を常に北極星に向かせたまま公転する場合は、
up軸を北極星に向ける必要がある
(実際の地球はそんな回転はしないけど、そういう状況を作りたいときに必要かも) あるいは、飛行機の宙返り飛行かも?!
普通、飛行機の前後にforward軸をとるはず
transform.position += Vector3.forwardで前へ進み、
taransform.RotateionAroundで、上空に設定したループ中心回りを公転して宙返り
その際、飛行機の背中(上下のup軸)はループ中心を向けていないといけない 人生は神ゲーだ。
本気でがんばるとぎりぎり倒せるように絶妙のバランス調節がされた敵。
単純作業じゃ効率が悪いけど、工夫次第でどんどん効率を上げられる経験値システム。
リセット不可の緊張感。でもシレンとかよりずっと死ににくいからあんま気にする必要なし。つーか普通のゲームでもリセットなんて邪道じゃん。
全てのキャラが深い人間性と歴史を持って登場する、圧倒的リアリティ。
グラフィックが綺麗すぎ。多分、無限×無限ピクセルで、毎秒無限フレームで動いてる。色も多分無限色使える。夕焼けとかマジありえねー美しさ。
BGMの種類がほぼ無限。選曲も自由。自分で作った曲を流すこともできる。人間が作ったとは思えない、とんでもなく複雑で洗練されたシナリオ。
リアル出産システム採用。自分と、自分よりも大切に思える相手の遺伝子を半分ずつ受け継いだ、奇跡のようなキャラを生み出して、そいつに自由に色々教えて育てることができる。
すごく嬉しいし、ちょー楽しい。ネコっつー生き物が登場するんだけど、これがちょーかわいい。
食いきれねーほどの種類の料理があって、超うまいものが時々食える。
説明書が無く、仕様が明かされてないから、自分でデータとって仕様を推測するしかない。これがまたとんでもなく高度に洗練された仕様になってるっぽくて、なかなか正確には分からん。
だから、とりあえず大雑把に推定し、それに基づいて行動して、データを取りつつ徐々に予測値を修正していく必要がある。
これがまた楽しい。徐々に明らかになっていく世界観。
未だに明らかになってない謎が山盛り。友達と一緒に協力して遊べる。無料。
本気で自分を愛してくれるキャラがいたりする。ゲーム内で別なゲームやったりアニメ見たり出来る。
エロゲと違って、主人公の勝手な行動でフラグが立つことがない。
登場キャラと本当に心を 通わせることが出来る。信じがたいほど深い感動を味わえるイベントが結構ある。もちろん本気でやらないとフラグを無駄にするだけだが。
こんなとてつもない神ゲーを糞ゲーとか言ってる奴は、本気でこのゲームをやったことがない奴だけ。
まあ、一切がんばらずにクリアできるようなヌルゲーばかりやってる奴には、このゲームはちょいとハードかもしれんがな。でも一端ハマった奴はみんな、このゲームを辞めたくないって言ってるぜ いいや、違うな・・・
おそらく、2DでLookAtが使えないからかもしれない!
2Dだと、forwardはZ方向、つまり、奥方向が前になる
2DでLookAtすると、forwardを対象物に向けるため、
スプライトが画面に対して垂直に立っちゃうからかも?
例えば、振り子運動させる時、上方に振り子の中心点を設定して、
左下45度から右下45度へ向かってRotateAroundで公転した場合、
オブジェクト上方=up軸を振り子の中心点へ向けないといけない
そもそも、2Dではup軸かright軸しか向きを変える際に利用できない・・・
(forward軸を変えたら、2Dでなくなってしまうから)
これが理由のような気がするなあ >>900
物理は使う?
2Dなの3Dなの??
Gravityオフにしてオブジェクトを生成すれば、落ちないよ
クリックしされたら、オブジェクトのGravityをオンにしたら良いんじゃ >>905
返信ありがとうございます。
物理は使っています。2Dで制作しています。
プログラムが書けなくてオブジェクトをランダムに生成してクリックでGravityをオンにするっていうようにするのが
どうやればいいのかわからなくて・・・。 星型のアセットモデルをインポート
↓
Hierarchyに追加して任意の角度(星型が正面に来る)にする
↓
それをプレハブ化
してもInspector内でデフォルトの角度に戻ってしまいます(オブジェクトとして使用する分には任意の角度になるんですが)
星型の弾丸を作ろうと思ってるんですが、プレハブから弾丸にするとデフォルトの変な角度のまま発射されてしまうんですよね… >>906
プログラムを書けるようになって動かせるようになりたいってこと? >>907
アセット内のプレハブの方のインスペクターで角度を指定すれば、
それをヒエラルキーに持っていっても角度は保たれているはず
スクリプトで動的にプレハブprefabを生成する場合、
生成時に角度Quaternionを指定できる
if?(Input.GetMouseButton?(0))?{ //クリック時
Vector3 position = new Vector3(Random.Range(-10.0f, 10.0f), 10, 0); //x座標をランダムに生成
Instantiate(prefab, transform.position, Quaternion.Euler(x, y, z)); //角度を指定してprefab生成
}
このスクリプトをprefabに載せる 半角スペースが文字化けして?になっちゃった・・・
左クリックされたら、
x座標を-10〜+10でランダム値
y座標を10
角度を(x度,y度,z度)
prefabを生成
2Dだと、
Rigidbody2D Rb2D;
Rb2D?=?GetComponent?<?Rigidbody?>?();
Rb2D.gravityScale = 1.0f;
もいるね
あらかじめ、prefabのRigidbody2Dで、
インスペクター上でGravityScaleは0にしておいてね; 流石にコード無しでDTB作るのは難しいと思うからプログラムを学ぶかかける人を探さないと無理だと思うよ public GameObject Obj; //prefabを指定しておく
Rigidbody2D Rb2D;
public class PrefabCode : MonoBehaviour {
void Update() {
if (Input.GetMouseButton(0)) {
Vector3 position = new Vector3(Random.Range(-10.0f, 10.0f), 10, 0);
GameObject Prefab = Instantiate(Obj, transform.position, Quaternion.Euler(x, y, z));
Rb2D = Prefab.GetComponent<Rigidbody2D>();
Rb2D.gravityScale = 1.0f;
}
} PrefabCodeは、ヒエラルキーで作成した空の2Dオブジェクトにでも入れておいて
もしかして、ランダムはオブジェクト自体か?
オブジェクトの形が数種類あるとか?
その場合は、ランダムでパターン番号0〜3とかを指定して、
if文で、違うprefabを生成する文を選択させるのが良いかも
空のオブジェクトのx座標を、マウスのx座標と揃え続けるコードも必要だな
マウスオーバーイベントに書いておく必要ありそう
prefabは空のオブジェクトの位置に生成されるから これで作られたRPGってありますか
ガチャゲーじゃない昔ながらのRPGです 2Dアクションゲームを作成しようとしている初心者です。
tilemap collider2dをアタッチしたtilemapの平面フィールド上で、
rigidbody2dとbox collider2dをアタッチして重力と当たり判定を付与したGameObject(Player)を歩かせたところ、
タイルに引っかかる形で止まってしまいます。
これを回避するためにcapsule collider2d等で接地面を点にすると止まることはなくなります(僅かに減速する)が、
当たり判定を□で判定したい為、可能であればbox collider2dで実装したいと考えています。
tilemapを使用した際のこういった引っかかり挙動を抑えることは可能でしょうか。 足元はcapsuleかcircleにして、
もう1つboxで足元から数ピクセル上を覆えば良いのでは?
collider2Dは1つという制約はないので、複合したら良いんじゃ >>899
>>887ですが、基本的にforward軸はオブジェクトの前後方向にとっているのですが、
円状(球状)の軌道で旋回しており、その際にオブジェクトの上下方向を、
軌道の中心(球の中心)へ向けておきたいのです・・・
人工衛星やスペースシャトルみたいな感じです
前方は進行方向を向けておいて、なおかつ上下は鉛直軸に揃えたいんです
前方が中心を向いちゃうと、上下に立った状態で周回してしまうので レスのアンカに引っ張られて間違えましたが、自分は883でした
>>904
2Dだとtransform.LookAtが機能しないんですね!
それじゃ、やっぱりforward以外の軸を向ける機能は大事ですね
>>885
ビックリです!
transform軸に目標座標を入れると、軸がそっちを向くんですね!
しかも、正規化して単位ベクトルにするひつようもないみたい
そしたら、transform.LookAtいらなくない?! >>918
レスありがとうございます。
当たり判定に違和感がない数ピクセルの差でbox collider2dをアタッチすると引っかかりは生じます。
引っかからない程度に足元を円形にすると角で滑り落ちるようになってしまいます。
DirectionをHorizontalにした角の丸い棒状のcapsulecollider2dでプレイヤーの上下左右を被った場合(角のない箱のような形)は、
引っかかることはなくなりますが、やはりタイルに当たりはするので、極僅かに減速してPlayerが数pixcel浮くことがあります。
またその際、OnCollision〜2Dイベントを監視すると、タイルに当たって浮いた瞬間にタイルとの接触判定が一瞬途切れている為、
ジャンプ判定等にも影響が出てしまう(空中にいる判定が誤作動する)のでタイルとの判定自体を正しく動作させたいと考えています。 回転するステージを作ってます
ステージにspawn位置を子オブジェクトとして設定して、そこから敵を出現させようと思ってるんですが
spawn位置がステージに追従して回転せず、固定されたままになってしまいます
オブジェクトをそのままステージの子にすると回転に追従できるんですが、
Spawnにスクリプトを設定してそこからオブジェクトを選んでくっつけるとどうもうまく行かず…
なにか解決方法はありませんか? >>909
遅レスすいません、詳しくありがとうございます。試してみます。 >>921
すみません自己解決しました。
edge collider2dを使用するか、box collider2dのedge radiusを0.001に設定することで、
タイルとの衝突(及びOnCollider系イベントの誤発生)はなくなりました。
参考:ttps://forum.unity.com/threads/rigidbody-getting-stuck-on-tiled-wall.220861/
ありがとうございました。 position とかと同じように代入できるんだね。リードオンリーだとばかり思ってた Unityの人達がどれほど「技術の民主化(デモクラタイズ)」とい
うものに心を払っているかは、多分外部の人達には想像できな
いと思います。この一点においいて、Unityは、世界中に沢山の
ファンを生み出し、そしてエバンジェリズムを行うチームのメンバ
ーも国境や政治制度を越えてひとつになれるのです。 その思想は非常に危険
それは即ち低賃金労働者の搾取がゲーム業界においても世界的に起こるようになるということと同義だからだ キケンかどうかは立ち位置によるし、資本主義では当たり前の話。 >>925
transform軸の座標は、自分のpositionをVector3.zeroとした時の相対座標で設定されている
自分のpositionが原点の場合は、transform軸の座標に目標のpositionを入れれば、
それが勝手に単位ベクトル化されて、方向ベクトルになるみたい
でも、自分のpositionが原点でない場合は、
transform軸の座標に「target - trans.position」で自分の座標を引いておく必要がある
だから、「target」だけを入れれば良いLookAtの方が簡単にできる(forward軸限定だけど)
あと、LookAtは第2引数で、up軸の方向も指定できる
(forward軸をtagetに向けた状態で、可能な限りup軸を指定方向に合わせてくれる) >>922
Instantiateで生成する時に、ちゃんと親を指定してる??
動的に生成したオブジェクトは、ステージとの親子関係が切れてない?
Instantiate(Object, Position, Parent) >>921
>>924
edge radiusなんて便利な機能が付いて、
矩形の判定枠の角を丸められるようになったんだね
いつも、足の前後に円形判定をおいたり、
カプセルを横にして置いて、地形判定専用にしてたわ ダメージを受ける毎に敵オブジェクトとかモデルが足元から徐々に(段階的に)赤くなって行くっていうのって、どういう原理で出来るんですか?
色々考えたんですけど思い付かなくて 歩くアニメーションがあってそれは実行すると前進するのですが
これをその場で足踏みだけさせるように簡単に変更はできますか? アニメーション再生するだけで前に動くことは無い
別のスクリプトでオブジェクトを進行方向に動かしているはず >>877
position等を直接いじったらそれはワープしてるのと同じだからね
移動や回転は事象に応じて物理エンジンがするものと考えれば、いろいろ扱いやすくなると思うよ >>938
apply root motionを指定しても動いてるんですよね。
>>936
歩く以外にもジャンプのアニメーションも上に飛び上がらないようにしたいとかです。 >>939
モーション自体の中で位置が動いてるなら簡単に動かないようにするのは無理
アニメーション編集してルートのトランスフォーム移動のキーを全部削除するしかない >>940
やっぱりそれしかないんですね。
自分で削除することにします。ありがとうございました。 LateUpdateでモーション適用後のトランスフォームを変更できる
ルートのボーンにLateUpdateで位置をlocalPosition=0,0,0にするコンポを付ければいい。 >>942
完璧に動作しました!ありがとうございました!! https://twitter.com/SpaceBackyard/status/898870157979811840
リンクすみません。
こういうカーソル位置?というか左右にしたら画面が切り替わるのってどうやれば出来るんでしょう?
マスクみたいな感じですか? >>885や>>942は優良回答者ですね。
しったかのヘタレ回答者が多い中で、すごいです!!! レス数が950を超えています。1000を超えると書き込みができなくなります。