ビワトレジャーの日記

湖付近に住んでいるうつ病ゲームプログラマーのブログ

UnityのGUIの優先について悩んだ

UnityのGUIの優先について悩みました。

例えば、ボタンを押すと黒いフィルター(GUI)がかかり、その上にまたボタンを表示させたい時。

GUIスクリプトのOnGUIで描画されています。

 

まず、考えたのがスクリプトを設定しているオブジェクトのレイヤーの変更。

WaterとかDefaultとかあるものです。

⇒優先変わらず。

 

次に考えたのが、オブジェクトのZ値を変更。

⇒優先変わらす。

 

訳が分からないので、Google先生に聞いてみましたが、中々、見つからず。

諦めかけていたのですが、あるサイト(どこか忘れました)で、

OnGUI中に

GUI.depth  = 優先度

と設定すると、管理出来るとのこと。

 

実際に試してみましたが、うまくいった!!!

Unity、便利ですがこういうところでちょいちょい、つまづきます

UnityのUIについて考えた

UnityのUIについて、休日色々、考えました。

最初はシューティングチュートリアル通り、GUITextで実装していたのですが、

解像度によって座標と大きさ変えようとしたけど、全然うまくいかない・・・。

ネットで見ているとGUILabelを使用しているのを見たので、それを入れたらいい感じになりました。

 

まず、ゲーム中の解像度を決定しました。

今作っているのは、360x960(9:16)。

ゲーム起動時に、Screen.Width,ScreenHeightでサイズを取得。

UIのスケールを決める。Screen.Width/360。

 

そのスケールを使用して、GUILabelのRectの設定全てにスケールをかけてやる。

フォントを使用している場合はフォントのサイズも変えてやる。

以下、書いたコード抜粋

-----------------------------------------------------------------------------------------

 void Start () {
  m_GameMgr = GameManager.Instance;
  
  m_Style = m_GameSkin.FindStyle("InfoDebug");
  m_Style.fontSize = (int)(32 * m_GameMgr.GetScreenScale());
  }
 

 void OnGUI()
 {
   GUI.Label(
     new Rect (100*m_GameMgr.GetScreenScale(), 0, 128*m_GameMgr.GetScreenScale(), 128*m_GameMgr.GetScreenScale()),
     "全てタップ",
     m_Style
    );
 }

-----------------------------------------------------------------------------------------

m_GameManagerはシングルトンでゲームを管理するクラスです。

m_GameSkinはpublicで、スキンをUnity上で設定しています。

 今のところ、いくつかの解像度でも良い感じでUIが表示されてます!!!

艦これ、6-1、S勝利2回

今まで諦めていた潜水艦任務、今週はろ号を諦めたので、突撃してみたら、

2回連続S勝利!!!

明日、明後日で潜水艦任務、終わるかも!!!

 

後、鉄がMAXに近かったので、20/20/250/250を100回程回した。

10cm砲x6

観測機x1

32号x4

33号x1

14号x3

中々、良い感じでした。

 

後は備蓄しつつレベリングだなあ。

秋イベントはまだか!!!

Unityのオブジェクトとマウスの当たり判定ではまった

Unityのオブジェクトとマウスの当たり判定ではまりました。

マウスの当たり判定の処理を書いたスクリプトを、オブジェクトに追加して、

オブジェクトを複数生成。

ここでは、オブジェA、オブジェB、オブジェCとします。

全て、座標は違います。

書いた当たりのスクリプト

------------------------------------------------------------------------------------

    
     Vector3 click = Input.mousePosition;
     
     Vector3 p = Camera.main.ScreenToWorldPoint(click);
     Debug.Log( "p.x=" + p.x + " p.y=" + p.y );
     Collider2D collition2d = Physics2D.OverlapPoint(p);
     if( collition2d )
     {

         Debug.Log("クリックされた");

     }

------------------------------------------------------------------------------------

 

この場合、どのオブジェをクリックしても、「クリックされた」が3回、表示されました。

どうも、Physics2Dで返すオブジェクトは自分以外も返すようです。

 

うまくいったコードは

------------------------------------------------------------------------------------

    
     Vector3 click = Input.mousePosition;
     
     Vector3 p = Camera.main.ScreenToWorldPoint(click);
     Debug.Log( "p.x=" + p.x + " p.y=" + p.y );
     Collider2D collition2d = Physics2D.OverlapPoint(p);
     if( collition2d )
     {

         if( collition2d.transform.gameObject == gameObject )

         {

              Debug.Log("クリックされた");

         }

     }

------------------------------------------------------------------------------------

自分のオブジェと比較する必要がある模様。

 

こうなってくると、各オブジェにタップ判定のスクリプトを追加するのではなく、

MainCamera等にスクリプトを追加して、中で判別してやる方が処理が軽そうな気がします。

その場合は、当たられる側がわかるように、共通のインターフェースクラスを継承して、各スクリプトで継承してやる必要があるのか・・・。

Unityでそのへん、楽に出来ると思ったのですが、いやはや。

Unityの2Dで回転動作②

昨日、回転動作をsin,cosでやっていると書きましたが、もっと簡単な方法がありました。

---------------------------------------------------------------------------

FixedUpdate内で

transform.Translate(0, speed, 0);

transform.Rotate(0, 0, add_deg);

---------------------------------------------------------------------------

これで良い感じに回転しました。

Translateで今の角度から進む方向に移動。

Rotateで自分自身を回転。

 

やっぱり色々、テストしてみるのが重要と認識。

今、作成しているゲームもボチボチ完成してきています。

※今回のゲームは、依頼を受けての作成なので公開されるまでは、ここでアドレス貼れないのが辛い。

Unityの2Dで回転動作

この三連休、Unityの2Dでの回転移動で悩んでました。

せっかく、物理エンジンがあるのでrigid2dbodyで移動と回転をさせたかったのですが、うまくいかず・・・。

Updateとdeltatimeで何とかしようと四苦八苦したのですが、どうもズレる。

仕方がないのでFixedUpdateで移動、回転はsin,cosで行うようにしました。

 

ネット上で見ていると、UpdateではInput関連を受け付けて、

FixedUpdateで移動させるみたい・・・。

とりあえず、うまくいっているのでこれで進めようと思います。