【Unity】C# + SceneManagerでのMulti Scene Editing

読み込み

using UnityEngine.SceneManagement;

参考:

Unity - Scripting API:
Unity is the ultimate game development platform. Use Unity to build high-quality 3D and 2D games, deploy them across mobile, desktop, VR/AR, consoles or the ...

複数のシーンを読み込んでいる状態で・・

1つのシーンをアンロードする

SceneManager.UnloadScene("シーン名");

シーン名は、Build SettingsのIDでもオーバーロードされる。
ただし、読み込まれているシーン名、シーンIDに限る(あたりまえだけど・・)

1つのシーンをロードする

ここでハマった。

SceneManager.LoadScene("シーン名", LoadSceneMode.Additive);

LoadSceneMode.Additiveを忘れない!

全部のシーンをアンロードして、1つだけ読み込む

SceneManager.LoadScene("シーン名");
// もしくは
SceneManager.LoadScene("シーン名", LoadSceneMode.Single);

普通にやるとこうなる。

Input.GetKeyDownとFixedUpdateは一緒にしないほうがいいっぽい

Unityで2Dのスクロールゲームを作っています。
スペースキーを押したとき、Jumpするように、次のようなコードを書きました。

void FixedUpdate()
{
    if (Input.GetButtonDown("Jump"))
    {
        // 処理
    }
}

しかし、ジャンプするときと、しないときがあり、

Linecastの問題かと思ってググっていたところ、

を見つけました。

サイトによると、FixedUpdateではInput.GetKeyDownはしないほうがいいらしいです。

理由は、FixedUpdateで、Inputの値がとれるタイミングとは限らないかららしいです。


bool IsDownJumpButton = false;
void Update()
{
    if (Input.GetButtonDown("Jump"))
    {
        IsDownJumpButton = true;
    }
}
void FixedUpdate()
{
    if (IsDownJumpButton)
    {
        // 処理
        IsDownJumpButton = false; // チェックしたよ
    }
}

【Unity】Script上でのnew GameObject()の使い方

(Unity5.3.1で確認)

Unityで空のGameObjectを作って、シーンに追加したいとき、

Instantiate(new GameObject());

あれー!!なんか2つ作られてるー・・

そうです。実は上のコード、二重でゲームオブジェクトを作っているのです!

というわけで、解決策。

new GameObject();

Instantiate()と書くことはできないので、new GameObject();とそのまま書いてみます。

これだけじゃ作るだけでコンポーネントのアタッチとか何もできないので、名前を変えてみます。

GameObject g = new GameObject();
g.name = "hello";

はい!できました。

なぜかUnityでtransform.Translateができなかった

なんでかわからないけどできなかった。

前は、Animatorでtransformを変えていたからできなかったれど、

今回は違った。

gameObject.transform.Translate(10, 10, 0);

こんな感じになっていたコードを、

var vec3 = gameObject.transform.position;
vec3.x += 10;
vec3.y += 10;
gameObject.transform.position = vec3;

こうしたらできた。

Unity2D用のアニメーションするスプライト作った

(移動はjsにて)

Unity2Dのゲームを作っています

その時に作ったキャラクターをアニメーションさせてみました!

初めてのアニメーションで、データ間違えたりとかして難しかったです。

ソフトは、Edgeを使わせていただきました。

画像はこちらです。

UnityでSliceしたとき、隣同士の画像の端っこが見えてしまうので、

1px間隔を開けています。

Unity2DでRaycastを使って座標からGameObjectを取得する

Raycastの練習として、やってみました。
ほかの取り方もあるかもしれません。

Vector3 pos = new Vector3(/* 好きな値 */);
RaycastHit2D hit = Physics2D.Raycast(pos, new Vector3(0, 0, 1), 100);

// 可視化
Debug.DrawRay(pos, new Vector3(0, 0, 100), Color.blue, 1);

// コンソールにhitしたGameObjectを出力
Debug.Log(hit.collider);

このhit.colliderでGameObjectを取れます。

マウス座標からもとれるよ

このやり方だと、遠回りになるかもしれませんが、
マウス座標からとるのも簡単です!
上のコードの最初の行を、次のように変えるとできます。

Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);

Unity2Dでspriteがぼやける

こちらのサイトを参考にしました。

キャラクターがかわいい!!

上のブログの通りで、

Assets ビューでSpriteを選択したとき、
Filter ModeをBilinearからPoint (no filter)に変えます。

ありがとうございます!