質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

Q&A

解決済

1回答

11890閲覧

Planeに文字列を表示させ、LookAtで追従させたい

ichi_goo

総合スコア18

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

0グッド

1クリップ

投稿2017/01/26 06:13

お世話になっております。

###前提・実現したいこと
時刻をPlaneに表示させ、そのPlaneが常に
カメラの方向を向くようにしたいと思っています。
時間表示
時刻を表示しているPlaneは以下のような構造をしています。
Plane
※カメラの角度はインスペクター上でX:30,Y:0,Z:0です。

###発生している問題・エラーメッセージ

以下の画像のように時刻を表示しているPlaneが後ろを向いてしまいます。
結果

###該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class LookAtScript : MonoBehaviour 6{ 7 /// <summary> 8 /// 移動速度 9 /// </summary> 10 public float speed = 0.5f; 11 /// <summary> 12 /// 対象Gameobject 13 /// </summary> 14 public GameObject Target; 15 /// <summary> 16 /// デフォルト回転量 17 /// </summary> 18 private Quaternion DefaultQ; 19 20 // Use this for initialization 21 void Start() 22 { 23 DefaultQ = transform.root.localRotation; 24 } 25 26 // Update is called once per frame 27 void Update() 28 { 29 transform.LookAt(Target.transform, Vector3.forward); 30 transform.localRotation *= DefaultQ; 31 } 32}

###試したこと
LookAtの第二引数は上方ベクトルの方向なので、
PlaneTimeの上方ベクトルとしてVector3.forwardを指定しても裏返り、
Textの上方ベクトルとしてVector3.upにしても裏返ってしまいました。
PlaneTimeベクトル
Textベクトル

その他色々とベクトルをマイナスにしたり、Vector3.back、
Vector3.downにもしてみていますが、正面を向くことはありません。
向きが相殺してしまっている???

transform.localRotation *= DefaultQ;

上記の1文をコメントアウトしたりしてみましたが、
今度は角度がおかしくなってしまい、カメラの方向には向いていません。

###補足情報(言語/FW/ツール等のバージョンなど)
unity5.5.0f3
Visual Studio2015

###参考にしたURL
プロ生ちゃんの視線を操作する(Transform.LookAt)
http://onoty3d.hatenablog.com/entry/2015/03/31/123832
Unity: Transform.LookAt()の回転軸を制限する
http://hamken100.blogspot.jp/2012/05/unity-transformlookat.html

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

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

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

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

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

sakura_hana

2017/01/27 01:29

「カメラの位置座標」「Textの位置座標」「transform.localRotation *= DefaultQ;をコメントアウトした時(LookAtだけ行なった後)のtransform.rotationの値」を教えてください。(transform.LookAtを行なっただけで角度は変更されるので、本来ならその後transform.localRotationを変更する必要は無い筈です)
ichi_goo

2017/01/27 02:02

カメラの位置座標:Pos(0,1.5,-4),rotation(30,0,0)、テキストの位置座標:Pos(3.5,-1,-0.1)(アンカーは左上です)、コメントアウト後のtransform.Rotation:(0.0, 1.0, 0.2, 0.0)です。ちなみにPlaneTimeはPos:(0,0,0)、rotation(-90,0,0)です。
sakura_hana

2017/01/27 02:07

LookAtScript.csはどのオブジェクトに付いていますか? また、CanvasのRenderModeは何になっていますか?
ichi_goo

2017/01/27 04:21

LookAtScript.csはPlaneTimeに付いています。CanvasのRenderModeはWorldSpaceです。
guest

回答1

0

ベストアンサー

試してみたところ、
「Planeの初期向きの関係上、LookAtをした後-90度X軸回転する必要がある」
「uGUIのオブジェクトは-Z方向が正面なので、LookAtをした後-180度Y軸回転する必要がある」
(Canvasオブジェクトの初期Rotation X=90とする)
というこのようです。

C#

1void Update() { 2
 transform.LookAt(Target.transform, Vector3.forward);3 transform.Rotate(new Vector3(-90f,-180f,0f));4}

このように、LookAtした後で更に回転させることで上手くいくかと思います。
(但しカメラの移動範囲によっては文字が反転するので、条件次第でRotateの角度を調整する必要があるかも)

PlaneTimeオブジェクトをPlaneではなく(uGUIの)Imageにして、Canvasの向きだけで考えるのが一番楽なのかなーとも思います。

投稿2017/01/30 07:42

sakura_hana

総合スコア11427

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

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

ichi_goo

2017/01/31 16:21

遅くなりましたが動作確認できました。ありがとうございました!!!教えていただいたImageを使う方も検討してみます。大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問