ぱふの自由帳

ぱふの技術ブログ。メインはUnity。気の向くままに書く...目標は週末を除く毎日更新。

for(~; ~; i=j++) という表現について【C#】

for(~; ~; i=j++)という書き方を初めて見たのでメモしておきます。
以下、unityでのコードとなります。

int i = 0, j = 0;
for(i=5, j=0; j<10; i=j++){
    Debug.Log (i.ToString() +"&"+ j.ToString());
}

出力結果は

5&0
0&1
1&2
2&3
...
7&8
8&9

となります。
代入->インクリメントの順に実行されているようです。

(……使う場面が思いつきませんが便利なのですかね…?)

初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています…(`・ω・´) ヨロシク!

キャスト演算子とas演算子の違い

データ型を変換する方法としてキャスト演算子やas演算子があります。
この二つの違いがあやふやな方からすると、intからfloatに変換する際には以下のように書く方法を思いつくんじゃないでしょうか。

int hoge = 1234;
float s1 = (float)hoge;

int piyo = 1234;
float s2 = piyo as float;

実はこれ、下の方のコードは動きません。

違いは何だ?

キャスト演算子は変換に失敗した際に”InvalidCastException例外”を投げます。それに対して、as演算子は変換に失敗した際に”null”を返します。

おわり

微妙な違いですが知っとくと変換の時にエラーが起こりづらかったり、変換に失敗した時の処理方法を間違わずに実装でき少し幸せになれます。

初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています…(`・ω・´) ミンナヨロシク!

型を取得する

typeof()GetType()って何が違うんじゃと思ったら全然違ったので、誰かの役に立てばと思って記事に残しておきます。

何が違うの?

GetType()の使い方は簡単に考えつきやすいと思います。int型なの?float型なの?みたいな時に使えばオッケーです。

typeof()の使い方ですが、以下のような使い方があります。

例1:コンポーネントを取得するのに使う

HingeJoint hinge = gameObject.GetComponent( typeof(HingeJoint) ) as HingeJoint;

例2:必要なコンポーネントを自動的に加える

[RequireComponent (typeof (Rigidbody))]

おわりに

調べてみると全然違った件については以上です。何か他にも情報あればコメントやTwitterでDMくれると嬉しいです…!

初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています…(`・ω・´) ヨロシク!

Time.timeScaleの効果について

連投3つ目です。毎日書いてる風にしようかと思ったんですが面倒なので一気に投稿します。今回はTime.timeScaleを簡単にまとめます。

Time.timeScaleについて

ゲーム内の時間を操作することができます。Time.timeScale = 0であるとゲーム内の時間が止まります。Time.timeScale = 1であれば現実の時間と同じ時間でゲームが動きます。しつこいですが、Time.timeScale = 0.5であるとゲーム内の時間が半分となり、いわゆるスローモーションになります。

Updateは止まらない!

最初はバグかと思いました。本当に。「止まってないじゃん」って。
実はTime.timeScale = 0は全ての関数が動かなくなる訳ではありません。
よく考えると当たり前ですね。どうやって復帰するんだよって話です。

止まるもの / 止まらないもの

止まるものとしては以下のようなものです。

  • アニメーション

  • Update / LateUpdate関数内の物理挙動系

  • FixedUpdate関数

止まらないものとしては以下のようなものです。

  • Update / LateUpdate関数内の物理挙動以外

  • GUI

止まらないものはどうやって管理されている?

どうやらTime.realtimeSinceStartupを使っているようです。Time.realtimeSinceStartupTime.timeScaleに関係なくスタート時からの経過時間(=現実時間)を持っている変数です。

おわり

知ってる人からすると当たり前なんでしょうが…最初は戸惑いました..orz
意識して使っていきましょうー!

初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています…(`・ω・´) ミナサマヨロシク!

ToStringの時に数値の表示桁数を指定する

ちょっとハマったのでメモです。

float hoge = 12.345f;
hoge.ToString("f1");

このようにすることで 12.3と表示されます。

OnApplicationPauseとOnApplicationQuitについて

どうもお久しぶりです。久しぶりの記事の投稿になってしまいました><。
今回はOnApplicationPause(bool)OnApplicationQuit()を分かっている範囲で簡単に記事にまとめておきます。

OnApplicationPause(bool)

アプリケーションが停止された際に呼び出される関数です。

[Unity エディタ編]

  • 一時停止ボタンを押しても呼び出されません

  • Unityから他のアプリにフォーカスを向けた時(例:Google Chromeで調べ物を始めた時)には停止として呼び出される

  • 当たり前ですが Time.timeScale = 0 にしても止まらない

[Android編]

  • ホームボタンでホームに戻った際に呼び出される

[iOS編]

  • ビルドが面倒臭いので試していません(多分Androidと同じなんじゃないかな…?)

bool部分

bool値として pauseStatusが与えられます。
起動時には必ずbool=falseの状態で関数が呼ばれます。ポーズ関数が呼ばれる前の状態をpauseStatusが渡してくれます。なのでホーム画面に戻る時にはbool=trueを渡して関数が呼び出されます。

OnApplicationQuit()

アプリケーションが終了された際に呼び出される関数です。

[Unity エディタ編]

  • 再生を終了した際に呼び出されます

[Android編]

  • Application.Quitを実行してアプリを終了した時に呼び出されます

  • ホーム画面に戻ってアプリを終了しても呼び出されません

[iOS編]

  • ビルドが面倒臭いので試していません
    ※以下にAndroidとは異なる注意点をスクショしたので貼っておきます

おわり

初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています…(`・ω・´) ヨロシク!

クリックで一番上にあるオブジェクトだけを取得する

概要

「重なっているオブジェクトの一番上を取得したい…!」「UIをクリックした際にUIと重なっているオブジェクトが反応しないようにしたい!」という方に役に立つかもしれません。

以下のような動作をするように実装していきます!

f:id:PafuOfDuck:20170615145618g:plain

実装

1.適当なオブジェクトを作成します。

2.以下のスクリプトをアタッチします。

Cube.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems; // 追加忘れないように!

public class Cube : MonoBehaviour, IPointerDownHandler{

    public void OnPointerDown(PointerEventData eventData){
        Debug.Log (gameObject.name);
    }

}

3.Cameraに以下のコンポーネントをアタッチします。Add Componet -> Event の中にあります。

f:id:PafuOfDuck:20170615151204p:plain

4.HierarchyにEventSystemがなければ以下のようにして追加します。

f:id:PafuOfDuck:20170615151650p:plain

【完成】

おわり

IPointerDownHandlerOnPointerDownを変更することでダブルクリックに対応できるようになります。Unityのスクリプトリファレンスで探してみてください!
クリックした位置にRayを飛ばして自分で場合分けをするのが面倒!って方におすすめですよ。

初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています…(`・ω・´) ヨロシク!