UnityのGUIの優先について悩んだ
UnityのGUIの優先について悩みました。
例えば、ボタンを押すと黒いフィルター(GUI)がかかり、その上にまたボタンを表示させたい時。
まず、考えたのがスクリプトを設定しているオブジェクトのレイヤーの変更。
WaterとかDefaultとかあるものです。
⇒優先変わらず。
次に考えたのが、オブジェクトのZ値を変更。
⇒優先変わらす。
訳が分からないので、Google先生に聞いてみましたが、中々、見つからず。
諦めかけていたのですが、あるサイト(どこか忘れました)で、
OnGUI中に
GUI.depth = 優先度
と設定すると、管理出来るとのこと。
実際に試してみましたが、うまくいった!!!
Unity、便利ですがこういうところでちょいちょい、つまづきます
大鯨と伊8の2隻目の入手
今日はいつも通り、2-5、大鯨出ねえかなあと周回してたら、キター!!!
その後、1-5行ったら、伊8もキタ━(゚∀゚)━!
どちらも2隻目。
これで、1隻目の大鯨を改造出来る。
オリョクルも捗る!!!
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で移動させるみたい・・・。
とりあえず、うまくいっているのでこれで進めようと思います。