ぱふの自由帳

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

Textを1文字ずつ表示する

はじめに

今回は以下のような機能を作成していきたいと思います。

f:id:PafuOfDuck:20170614093000g:plain

実装

以下のような機能を持たせるようにします。

  • 1文字ずつ表示を行う
  • 表示途中でキーが押されたら残りの文章を一気に表示
  • 表示完了時にキーが押されたら次の文章へ

UIを設置する

UIの設置は特に解説しないので、UIの設置方法が分からない方はGoogle先生に聞いてください。

TextController.csを作成

先ほど挙げた機能を持たせるためにスクリプトに記述していきます。いつもお世話になっているテラシュールブログさんの以下の記事を参考にしています。(ほとんど真似していますが…)

tsubakit1.hateblo.jp

TextController.cs

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

public class TextController : MonoBehaviour {

    public string[] sentences; // 文章を格納する
    [SerializeField] Text uiText;   // uiTextへの参照

    [SerializeField][Range(0.001f, 0.3f)]
    float intervalForCharDisplay = 0.05f;   // 1文字の表示にかける時間

    private int currentSentenceNum = 0; //現在表示している文章番号
    private string currentSentence = string.Empty;  // 現在の文字列
    private float timeUntilDisplay = 0;     // 表示にかかる時間
    private float timeBeganDisplay = 1;         // 文字列の表示を開始した時間
    private int lastUpdateCharCount = -1;       // 表示中の文字数


    void Start () {
        SetNextSentence ();
    }
    

    void Update () {
        // 文章の表示完了 / 未完了
        if (IsDisplayComplete ()) {
            //最後の文章ではない & ボタンが押された
            if (currentSentenceNum < sentences.Length && Input.GetKeyUp (KeyCode.Space)) {
                SetNextSentence ();
            }
        } else {
            //ボタンが押された
            if (Input.GetKeyUp (KeyCode.Space)) {
                timeUntilDisplay = 0; //※1
            }
        }

        //表示される文字数を計算
        int displayCharCount = (int)(Mathf.Clamp01((Time.time - timeBeganDisplay) / timeUntilDisplay) * currentSentence.Length);
        //表示される文字数が表示している文字数と違う
        if (displayCharCount != lastUpdateCharCount) {
            uiText.text = currentSentence.Substring (0, displayCharCount);
            //表示している文字数の更新
            lastUpdateCharCount = displayCharCount;
        }
    }

    // 次の文章をセットする
    void SetNextSentence(){
        currentSentence = sentences [currentSentenceNum];
        timeUntilDisplay = currentSentence.Length * intervalForCharDisplay;
        timeBeganDisplay = Time.time;
        currentSentenceNum++;
        lastUpdateCharCount = 0;
    }

    bool IsDisplayComplete(){
        return Time.time > timeBeganDisplay + timeUntilDisplay; //※2
    }
}

※1…0にするとMathf.Clamp01()で強制的に1になるようにしています
※2…終了しているかを時間で確認しています

TextControllerオブジェクト作成 -> 設定

空のゲームオブジェクト作成して、名前をTextControllerにします。
次にTextControllerにTextController.csをアタッチします。 アタッチできたら、以下のように設定します。

f:id:PafuOfDuck:20170614094940p:plain

  • Interval For Char Dispというのは1文字の表示にかける時間なので適当に設定してください。
  • Ui Textには各自作成したUIのTextを設定してください。

完成

再生すると動くと思います。

おわりに

以上です。新たに追加機能が必要になれば随時更新していきたいと思いますー。

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

Nostalgia 2の使い方メモ

概要

UnityのAssetStoreにあるNostalgia 2の使い方メモです。試行錯誤しているのでもっと簡単な方法があるかもしれません…知っている方は教えていただけると喜びます><。
公式ページはこちら

Map / Cell / Tile

  • Map…Nostalgia Map で作られるオブジェクト。名前から分かるようにMapを管理している。

  • Cell…Mapを1マス単位で管理している。3×4のMapであれば12のCellが存在する。

  • Tile…Cellに設定されているTileを指す。

ある箇所のTileにアタッチしたコンポーネントを読み込む

タイルの場所を元に読み込む方法として以下のような方法がある。

  1. 読み込む予定のTileにコライダーを付ける。
  2. コライダーを取得 -> コライダーからMapを取得 -> MapからCellを取得 -> CellからTileを取得 -> Tileにアタッチされているコンポーネントを読み込む
    文字だと分かりにくいのでコードも載せておきます。
Collider2D col = Physics2D.OverlapPoint(new Vector2(X, Y));
Map map = col.GetComponent<Map>();
Cell cell = map.GetCell (new Point2((int)X, (int)Y));
Tile tile = cell.tile;
Hoge hoge = tile.GetComponent<Hoge> ();

以下のやり方ではTileにアタッチされているコンポーネントが取得できないので注意。

Collider2D col = Physics2D.OverlapPoint(new Vector2(X, Y));
Hoge hoge = col.GetComponent<Hoge>();

Tile用の新しいコンポーネントを作成する

using UnityEngine;
using System.Collections;

namespace Nostalgia.Example
{
    [AddTileMenu("HogeHoge/PiyoPiyo")]
    public class A : TileComponent
    {
        ここに実行内容を記述する。
    }
}

上記のようにすればAdd Component -> HogeHoge -> PiyoPiyoとしてコンポーネントを追加できる。

未解決問題

  • TileSetのTileを選択する際に以下のようなエラーが出る
NullReferenceException: Object reference not set to an instance of an object
Nostalgia.Tile+<GetComponents>c__AnonStorey0.<>m__0 (Nostalgia.TileComponent
(以下略)
  • Import from sprite が重い。数が数百になるとスクロールが困難レベル。設計上の問題である可能性があるので解決方法があるかは不明。

おわり

もう少しチュートリアルが充実していれば嬉しいですね…スクリプトリファレンスが日本語なのでなんとか手探りで進んでいる状況です><;

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

その場所にコライダーがあるか確認する

Physics2D.OverlapPoint

Physics2D.OverlapPointを用いることである地点にコライダーが存在しているのかどうかを確認できます。
以下の方法でその地点にあるコライダーを取得することも出来ます。

Vector2 pos = new Vector2( 適当な値 );
Collider2D col = Physics2D.OverlapPoint(pos);

ちなみにコライダーが存在しなければcolにはnullが代入されます。

おわり

これを用いることでRPGのように壁を考慮したキャラ移動を実装することができます。その記事を書く予定なので書き上がり次第、以下にリンクを貼っておきます。

[…リンク予定地…]

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

変数名を一括変換する

はじめに

タイトル通り、変数名を変えたいと思った時に一括で変数名を変える方法です。この方法なら開いていないファイルの変数も勝手に変更してくれます。∩(´∀`)∩
ちなみに、私は今日初めて知りました(´・ω・`)

やり方

変えたい変数名を選択 -> 右クリック -> Refactor -> Rename で表示される画面に変更後の名前を入力すればOKです。

f:id:PafuOfDuck:20170526205108p:plain

おわり

この方法知ってる方に「え?毎回ファイル開いてReplaceしていたの?」と言われそうですが、その通りです。「めんどくさいなぁ。。もしかしたら一括変換できるやつ用意されてるんじゃ…?」と思ってググってみると普通にありました…orz

知らなかった仲間の方はこれを機に使いまくってやりましょう..!

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

Resources から Sprite を読み込む方法

はじめに

恥ずかしながら、どハマりしてしまいました…orz
メモも兼ねて読み込み方を記しておきます。

方法紹介

方法を二つほど紹介しておきます。

  • Resources.Load <Sprite>(“hoge”)
  • Resources.Load (“hoge”, typeof(Sprite)) as Sprite

ハマったトコロ

参考までにどうやってハマったのかを…

  • Resources.Load (“hoge”) as Sprite

と書いてしまっていてハマりました。
ハマる前までは Resources.Load (“hoge”) as Sprite と Resources.Load <Sprite>(“hoge”) は同じキャスト変換だろうだと思ってたんですが、、調べてみるとどうやら違うようですね。

おわり

キャスト変換がどれで、これはジェネリックの何たらかんたらでした。みたいなお話はまた今度したいと思いますー。というか、今は私自身も怪しいので出来ません…w
今日のところは方法だけ示して終わりです…(。-人-。)スイマセヌ

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

背景をループさせる方法 -その1-

はじめに

背景をループさせる方法について備忘録も兼ねて書いていきます。その1と書いてるのは他にも方法があるので後々書く予定だからです…φ(。_。*)

方法紹介

MaterialとQuadを用いて背景のループ処理を行います。
どこかで見たことあるような方法ですね…。実はUnityの公式にもある2Dシューティングのチュートリアルで使われている方法です。以下にリンクを貼っておきます。

Tutorial - 2D Shooting Game 第06回 背景を作る

「ならチュートリアルのリンク貼って終わりでいいじゃないか」という声が聞こえてきそうですが、このチュートリアルでは「Material をアタッチしよう」としか書いていないのです。いざ真似しようとすると Material の作り方が初心者の方には分からないのです。…私もそうでした(;´Д`A

スクロールさせていく

テクスチャの設定

Unityにインポートした画像の設定として Texture Type を Default[※1] に、Wrap Mode を Repeat に変更してください。ここでエラーが出る場合は画像サイズが2の累乗にすると解消すると思います。

※1…Spriteでも問題ありませんでした。申し訳ありません。

f:id:PafuOfDuck:20170523162505p:plain

マテリアルの作成

Project -> Materialを選択し、Material を作ります。次に、Material の Shader をunlit -> Transparentに設定します。

f:id:PafuOfDuck:20170523163232p:plain

最後に Select と書いてあるボタンを押せば画像が選択できるので、先程作成したテクスチャを選択します。

スクリプト作成

背景のスクロールを行う Background.cs の作成をします。チュートリアルものと全く同じものです。

Background.cs

using UnityEngine;

public class Background : MonoBehaviour
{
    // スクロールするスピード
    public float speed = 0.1f;

    void Update ()
    {
        // 時間によってYの値が0から1に変化していく。1になったら0に戻り、繰り返す。
        float y = Mathf.Repeat (Time.time * speed, 1);

        // Yの値がずれていくオフセットを作成
        Vector2 offset = new Vector2 (0, y);

        // マテリアルにオフセットを設定する
        GetComponent<Renderer>().sharedMaterial.SetTextureOffset ("_MainTex", offset);
    }
}

組み合わせる

ここまで用意すると後は組み合わせるだけです。GameObject -> 3D Object -> Quadから Quad を作成します。この Quad に作成した Material をドラッグ&ドロップして設定します。また、Quad に Background.cs も忘れずにアタッチしておきましょう。

ここまで行うと以下のようになっているはずです。

f:id:PafuOfDuck:20170523164744p:plain

後は再生してみましょう。ループしながら動き出すはずです。(*‘-’)b

おわり

以上で説明は終了です。gifか何かで動かした方が見易いですよね…
やり方わからないので近いうちに調べておきます。(・ω・。≡。・ω・)キョロキョロ

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

Unityで実機デバッグを手軽に行う方法

はじめに

「Unityの実機デバッグを行う際に毎回ビルドして…簡単な動作の確認がしたいだけなのに面倒!もっと手軽な方法ないの?」って方へ"Unity Remote 5"の紹介記事です。「それ有名じゃん。使ってるよー。」って方は読む必要すらない簡単な記事になっています(´・ω・`)

Unity Remote 5

Unity Remote はUnityの公式が出している開発補助アプリケーションです。以下のリンク先が公式サイトにあるマニュアルです。

Unity Remote マニュアル

使い方

上に載せたリンク先にも書いている内容を書き直したものです。

実機側

現在の最新バージョンは Unity Remote 5 であるので Android なら Playストアから、iOSなら App Store からインストールしましょう。インストールが終了したらアプリを立ち上げておきます。

PC側

USBケーブルで実機と繋ぎます。そうすると、Edit -> Project Settings -> Editor を開いたところにある Unity Remote の Device を変更できるようになっているので実機が当てはまるものを選びましょう。

f:id:PafuOfDuck:20170522153316p:plain

なお、Compression は JPEGPNG から選べますが、PNGJPEG に比べて画質が向上する分、遅延が増大するようです。

実行する

ここまで終われば、あとはUnityのエディター上で再生を行えば実機にも画像が出力され、実機からの入力を受け取れるようになります。

注意点

便利な Unity Remote 5 ですが、やはり遅延や画質低下は避けられません。遅延や画質低下が出ると困る方はビルドすることをお奨めします。

最後に

このアプリを知らなかった方は使用してガンガン実機デバッグをしていきましょう!結構な時間の節約になりますよ(o^∇^o)ノ

何かありましたらコメントをお願いします!

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