🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

1378閲覧

unity 追記:pos.yとインスペクター上のPosYの違いとは

NeoPro2045

総合スコア2

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/12/27 10:01

編集2020/12/27 12:40

やりたいこと

mini3のPosYが100になるまでmini1,mini2,mini3を移動させ続けた後、プログラムを停止させたいです。

###問題

PosY100で止まらずに動き続けます
↑の挙動については解決しました。
が、根本的な解決には至ってないのでタイトルの疑問について教えていただきたいです。
詳しくは下のコメントを見ていただきたいです。

###該当のコード

C#

1public class miniStManager : MonoBehaviour 2{ 3 [SerializeField] GameObject mini1, mini2, mini3; 4 int y; 5 miniStManager miniSt; 6 // Start is called before the first frame update 7 void Start() 8 { 9 miniSt = this; 10 } 11 12 // Update is called once per frame 13 void Update() 14 { 15 if (y <= 100) 16 { 17 mini1.transform.Translate(0.6f, 0.5f, 0f); 18 mini2.transform.Translate(0.3f, 0.5f, 0f); 19 mini3.transform.Translate(0f, 0.5f, 0f); 20 Vector2 pos = mini3.transform.position; 21 pos.y = y; 22 } 23 else 24 { 25 miniSt.enabled = false; 26 } 27 } 28


オブジェクトはボタンです

###コメント

プレイ前のインスペクター上のPosYは0です。
何分始めたばかりでにっちもさっちもわかりません。
ご助言を賜らせてください…

追記:debug.log(y);をvoid updateの中に書いたところ、ずっと0が吐き出されていました。
インスペクター上のPosYの数値は問題なく上がり続けていました。

追追記:debug.logを(y)ではなく(pos.y)にしてifの中に書いたら正常に数値が吐き出されるようになりました。
なぜyで吐き出されなかったのかという問題はさておき、数値を見ると、どうやらインスペクターが指すPosY:100とpos.yの100の定義が大きく乖離しているようだということがわかりました…

このことから、if (y <= 100)をif(pos.y<=0.33f)にすることで一応挙動の解決は致しました。
(0.33fは手探りで見つけたPosY:91になる数値です)
ですが、根本的な解決というか、理屈の理解はできていません…
今度はpos.yの指す位置とは何を基準にしたものか知りたいです。教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fiveHundred

2020/12/27 11:34

PosYってものが提示のコード上に無いので、具体的に何を示しているのかすら分かりません。 そこが分からないと回答しようがないので、赤の他人に分かるように追記してください。 (説明しづらいのであれば画像を追加してください)
guest

回答2

0

自己解決

ワールド座標とローカル座標を混同していました。
インスペクターに表示されるPosYがローカル座標で、スクリプトで扱ってたpos.yがワールド座標でした。
mini3.transform.positionをmini3.transform.local Positionにしたらif(pos.y <= 100)が通用しました。
ありがとうございました。

投稿2020/12/27 13:35

NeoPro2045

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C#

1 Vector2 pos = mini3.transform.position; 2 pos.y = y;

ここで何かやろうとしていると思うのですが、このコードでは何も起きません。
Vector2はクラスではなくstructなので、この状況でpos.yを変更しても、mini3.transform.positionには反映されません。

また、mini3はmini3.transform.Translate(0f, 0.5f, 0f);で独自に動いているので、変数yとゲームオブジェクトのY座標(=mini3.transform.position)が一致せず、このような挙動になっているのだと思います。

投稿2020/12/27 11:53

fiveHundred

総合スコア10152

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fiveHundred

2020/12/27 12:05

投稿しておいてあれですが、修正依頼欄に書いた通りPosYが何者かが明確になっていない状態でのエスパー回答なので、間違っているかもしれません。
NeoPro2045

2020/12/27 13:16

pos.y=yは、if (y <= 100)のところで(pos.y <= 100)をしてはいけないという謎の思い込みでそうしてました。今はint yは廃止してif(pos.y <=○○)と書いてます。 あと最初の定義の時点でy=0と書いてないのもミスです。 現状、私はpos.yがインスペクター上のPosYと同一だと思っていて、だから 『「ここに到達したら移動を止めたい座標」にscene上でオブジェクトを置いたときのPosYの数値(100)(座標そのものの数値ではない、親オブジェクトの座標を原点としたものとしてインスペクターに表示される数値)』←言い方がわからない… をそのままifに入れました。
NeoPro2045

2020/12/27 13:21

すみません、自己解決しました! 回答ありがとうございました????
NeoPro2045

2020/12/27 13:22

↑↑の内容を書き起こしたことで客観的に理解できた感じがします。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問