キューバに行ってみたい

ゲーム開発とかWeb開発とか

[Unity] build 設定で過去に build 設定した Scene を完全に削除する方法

Version unity 2021.2.17. f1 で動作検証を行なっています。

build 対象の Scene 設定において、過去に build 対象にした Scene を除外すると deleted として index も残り続けます。

Scene の数が多くなるようなゲームを開発していると削除する可能性もありえる為、これらが溜まってしまい視認性も悪くなってしまいます。

削除方法

build 対象の Scene は ProjectSettings/EditorBuildSettings.asset というファイルで管理されています。

このファイル以下のような YAML ファイルになっています。(一部抜粋)

  - enabled: 1
    path: Assets/Scenes/Stages/Stage6Scene.unity
    guid: xxxxxxx
  - enabled: 0
    path: 
    guid: 00000000000000000000000000000000
  - enabled: 0
    path: 
    guid: 00000000000000000000000000000000
  - enabled: 0
    path: 
    guid: 00000000000000000000000000000000

enabled: 1 が有効な Scene なので enabled: 0 のものを削除することで index からも削除され整理することができます。

他に影響がないとは思いますが、自己責任でお願いします。

[Unity] EventTrigger を使ってテキストをクリックできるようにする

Version unity 2020.3.32.f1 で動作検証を行っています。

Button オブジェクトにはクリックで何かしら処理をさせるというような仕組みが初めから用意されていますが、
Text のようなオブジェクトはそのような仕組みが用意されていません。

Button オブジェクト以外でもクリックで何かしら処理をしたいことがあるかと思います。

今回はそのような場合の実装方法の一例を紹介したいと思います。

実装方法

まずテキストに EventTrigger の component を追加します。

そして以下の script を作成し、テキストにアタッチします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Click : MonoBehaviour
{
    public void OnClick()
    {
        this.gameObject.GetComponent<Text>().text = "isClick";
    }
}

OnClick メソッドではテキストを "isClick" に変更する処理を書いています。

次に先ほど追加した EventTrigger Component で Event Type Pointer Down を追加します。
この Pointer Down ではポインターがオブジェクトを押下したことを検知することができます。

最後に Pointer Down の Event として OnClick メソッドを登録することで、
オブジェクトを押下すると OnClick メソッドを発動することができます。

分かりにくいですが、このように動作確認することができます。

簡単ですが以上です。

[Unity] 画面のどこをタップしても画面遷移できる画面を実装する

Version unity 2020.3.27.f1 で動作検証を行っています。

スマホゲームを開発していると画面をタップしてゲームスタートさせるというような画面を作成したいことがあるかと思います。

このように画面のどの部分をタップしても画面遷移ができる画面です。

今回はこのような画面の実装方法について紹介したいと思います。

実装方法

Tap To Start というテキストは単純に画面の中心に配置し、特に Script のアタッチなどは行いません。

ポイントとなるのが TapObj で、これは空オブジェクトを画面全体に配置し、全体に BoxCollider2D をアタッチしています。

こうすることで画面をタップするイベントを拾うことができます。

そして以下の script を作成して TapObj にアタッチします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class TapToStart : MonoBehaviour
{
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            SceneManager.LoadScene("Stage1Scene");
        }
    }
}

この script は Update() メソッドでタップされたことをチェックし、タップされた場合 Stage1Scene に遷移するといった内容になっています。

以上で画面のどこをタップしても遷移する画面を作成することができます。

より良い実装方法があれば、ぜひ教えていただけると助かります。

[Unity] script で子オブジェクトを全て削除する

Version unity 2020.3.27.f1 で動作検証を行っています。

特定のオブジェクトの子オブジェクトを全て削除したいことがあるかと思います。

例として、ボタンをクリックすると Canvas の子オブジェクトのテキストを全て削除する実装を紹介します。

実装方法

このように DeleteCanvas の子オブジェクトに複数 Text を配置します。

そしてこれらの Text を削除する script を以下のように用意して、button にアタッチします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class DeleteAllText : MonoBehaviour
{
    [SerializeField] private Canvas canvas;
    public void Delete()
    {
        foreach (Transform g in this.canvas.gameObject.transform)
        {
            Destroy(g.gameObject);
        }
    }
}

やっていることは子要素分 foreach でループさせて削除しているだけになります。

今回は以上になります。

[Unity] n秒ごとにイベントを発火する script を書いてみる

Version unity 2020.3.27.f1 で動作検証を行っています。

特定の周期でテキストを点滅させたいなどあるかと思います。

今回はそのような n秒ごとに特定のイベントを実行したい時の実装例を紹介します。

0.5秒ごとにテキストを点滅させてみる

例ではテキスト (TextMeshPro) を 0.5秒ごとに点滅させます。

こんな感じです。

以下の script を text にアタッチします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;


public class BlinkingTextController : MonoBehaviour
{
    private TextMeshProUGUI t;
    private float alpha = 1.0f;
    private float elapsedTime = 0f;

    private void Start()
    {
        this.t = this.gameObject.GetComponent<TextMeshProUGUI>();
    }

    private void Update()
    {
        Blink();
    }

    private void Blink()
    {

        this.elapsedTime += Time.deltaTime;
        if (this.elapsedTime > 0.5f)
        {
            this.alpha = this.alpha == 1.0f ? 0.0f : 1.0f;
            this.t.color = new Color(255, 255, 255, alpha);
            this.elapsedTime = 0.0f;
        }
    }
}

elapsedTime に Time.deltaTime を加算し前フレームからの経過時間を積み重ねます。

elapsedTime (経過時間) が 0.5f秒経過するごとに text の alpha値を変更して点滅させています。

今回はテキストを点滅させましたが、他の処理でも応用することができるかと思います。

簡単ですが以上です。

[Unity] OnCollisionStay2D を使って物体が接触していることを検知する

Version unity 2020.3.27.f1 で動作検証を行っています。

前回は物体が離れたことを検知する方法を紹介しました。

blog.bestinarix.studio

今回は物体が接触していることを検知する方法を紹介します。

実装方法

今回のサンプルは円が落下して四角形に接触するとテキストが off から on に変わるような script を書きます。

物体の衝突は OnCollisionEnter2D メソッド、離れたことは OnCollisionExit2D メソッドで検知すると以前記事に書きました。

接触状態は OnCollisionStay2D メソッドを使用します。

以下のような script を準備します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class StayController : MonoBehaviour
{
    [SerializeField] Text _text;
    private void OnCollisionStay2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "circle")
        {
            _text.text = "on";
        }
    }
}

この script を四角形にアタッチして、_text には off のテキストをアタッチしておきます。

離れた時と同様に円には circle の tag を設定して Rigidbody 2D もアタッチしておきます。

もちろんそれぞれのオブジェクトに collider を設定しておく必要もあります。

設定は以上でこれで動かしてみると以下のように期待通りの挙動が実現できます。

参考

docs.unity3d.com

[Unity] OnCollisionExit2D を使って物体が衝突から離れたことを検知する

Version unity 2020.3.27.f1 で動作検証を行っています。

以前物体の衝突の検知方法を紹介しました。

blog.bestinarix.studio

今回は物体が離れたこと検知する方法を紹介します。

では早速実装方法です。

実装方法

サンプルとして円が四角形から離れるとテキストが off から on に変わるような script を書きます。

物体の衝突は OnCollisionEnter2D メソッドで検知できましたが、離れたことは OnCollisionExit2D メソッドで検知することができます。
この他にも OnCollisionStay2D メソッドというのも存在し物体が接触していることを検知します。
これはまた別の機会で紹介したいと思います。

以下のような script を準備します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ExitController : MonoBehaviour
{
    [SerializeField] Text _text;
    private void OnCollisionExit2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "circle")
        {
            _text.text = "on";
        }
    }
}

この script を四角形にアタッチして、_text には off のテキストをアタッチしておきます。

円には circle の tag を設定して Rigidbody 2D もアタッチしておきます。
これで円が重力によって落ちるようになります。

設定は以上でこれで動かしてみると以下のように期待通りの挙動が実現できます。

参考

docs.unity3d.com