「Unity メモ」タグのついた投稿

今回は円ゲージ、もしくは円型のカウントダウン等の演出で使える表現を紹介します。

(さらに…)

今回はuGUIを使用してゲージを作る方法を紹介します。

 

まずは、UnityのメニューからGameObject > UI > Slider を選択肢してスライダーを作成してください。

gauge0次にハンドル部分が邪魔なので消します。Sliderオブジェクトの子供にある”Handle Slide Area”のオブジェクトを消してください。

gauge1現状だとゲージの下地と現在値の表示位置がずれているので、調整します。Sliderの子供のFill Areaとその子供のFillのX,Y,Z,Left,Rightの全てが0になるように変更してください。

gauge2ついでに、ゲージの色を変えたい場合はFillの色を変更してください。

最後にゲージの最大値を設定します。SliderオブジェクトのSliderコンポーネントのMax Valueに使用する最大値を設定してください。

gauge3スクリプトから設定したい場合(現在のキャラの最大HPを適応させたい場合など)、slider.maxValueで設定出来ます。

        UnityEngine.UI.Slider slider = GetComponent<UnityEngine.UI.Slider>();
        slider.maxValue = max;

これでゲージが完成しましたので、後は現在値が変わったらSliderクラス内のvalueに現在の値を設定してください。

        UnityEngine.UI.Slider slider = GetComponent<UnityEngine.UI.Slider>();
        slider.value = Mathf.Clamp(current, slider.minValue, slider.maxValue);

currentは現在値で設定する時にSliderに設定されている最低値と最大値に収まる様に設定しています。

以上になります。

今回はUnityのuGUIで文字を1文字づつ表示していく方法をメモします。

内容的にはXNAメモ – 流れるテキストの作り方 と大体同じです。

(さらに…)

Unityでアニメーションの遷移や変数の設定を付けたり、消したり、移動したりしていると、”Null transition in state ‘AnyState’ ” と言うエラーが出てきたり、遷移画面でも”Not found”と言う遷移が一覧に出てきます。

これを手で一つづつ消していくのは面倒なので、一括で削除する為のエディタ拡張を紹介します。

(さらに…)

今回はUnityでCSVファイルを読み込む方法を紹介します。

CSVファイルは中身がスプレッドシート(エクセルとか)みたいなデータが文字として入っています。各セルに当たる箇所は”,”と段によって区切られています。

例を上げるとエクセルではこう表示されるファイルがあるとして:

excel0
それの中身がこうなっています:
15,15,1,15,15,15,

15,15,6_u0,15,15,15,

15,15,6,15,15,15,

4_s,5,13_v0_u0,5,5,2_g,

ですので、読み込み方としましては、Resource.Load()でテキストデータとして読み込んでから、StringReaderに渡して、セル毎にデータを分けてListに保存します。

 

ではさっそく実装に入ります。まずクラス宣言です。

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;

/// <summary>
/// CSVファイルを読み込み、データを保持するクラス
/// </summary>
public class CSVReader
{
    /// <summary>
    /// CSVファイルの拡張子
    /// </summary>
    public const string _EXTENSION = ".csv";

    /// <summary>
    /// セルを区切る為にキャラ
    /// </summary>
    public const char _SPLIT_CHAR = ',';

    /// <summary>
    /// 行がコメントだと言う事を表す文字列
    /// </summary>
    string m_commentString = "//";

    // 読み込んだデータ
    List<List<string>> m_data = new List<List<string>>();
    TextAsset m_textAsset = null;

    /// <summary>
    /// コンストラクタ
    /// </summary>
    /// <param name="comment">コメントの文字列</param>
    /// <param name="isReadFromDisc">Resourcesでなくディスク(フルパス)から読み込むか</param>
    public CSVReader(string comment = "//")
    {
        m_textAsset = null;
        m_data = new List<List<string>>(10);
        m_commentString = comment;
    }

区切りで使用する”,”も宣言しておきます。List<>の中にList<string>を宣言する事で、入れ子的にして2次元配列の変わりにしています。別に2次元配列を作っても大丈夫です。

次に読み込み処理です。まず、テキストファイルをResourcesから読み込んで、TextReaderを返す処理を作ります。

    private TextReader CreateTextReader(string fileName)
    {
        m_textAsset = Resources.Load<TextAsset>(fileName);
        return new StringReader(m_textAsset.text);
    }

それでは実際の読み込み処理です。やる事としましては、上記の処理を呼んでデータを読み込んだ後に、1行ずつ拾っていき、それを各セル毎に区切って保存します。

    public bool Load(string fileName) 
    {            
        m_data.Clear();
        TextReader reader = CreateTextReader(fileName);

        int counter = 0;
        string line = "";
        while ( ( line = reader.ReadLine()) != null ) 
        {
            // コメントが入っている時はスキップする
            if ( line.Contains( m_commentString ) )
            {
                continue;
            }
            
            // 今の列をマス毎に区切る
            string[] fields = line.Split( _SPLIT_CHAR );
            m_data.Add( new List<string>() );

            foreach ( var field in fields )
            {
                if (field.Contains(m_commentString) || field == "")
                {
                    continue;    
                }
                m_data[ counter ].Add( field );
            }
            counter++;
        }

読み込みが終わりましたので、リソース開放をしておきます。

        // 読み込んだリソースを開放する
        Resources.UnloadAsset(m_textAsset);
        m_textAsset = null;
        Resources.UnloadUnusedAssets();
        return true;
    }

これでデータは準備出来ましたので、後はデータを獲得する処理を宣言していきます。

データは全部文字列として保存しておりますが、CSVの中で数値等を扱う事が有りますので、様々な取り出し方を作っておきます。

    public string GetString(int row, int col)
    {
        return m_data[ row ][ col ];    
    }

    public bool GetBool(int row, int col)
    {
        string data = GetString(row, col);
        return bool.Parse( data );
    }

    public int GetInt(int row, int col)
    {
        string data = GetString( row, col );
        return int.Parse( data );
    }
        
    public float GetFloat(int row, int col)
    {
        string data = GetString( row, col );
        return float.Parse( data );
    }

後は実際にCSVReaderのインスタンスを作ってデータを使うだけです。

        string path = "WordTable"; //今回はResources直下の想定
        CSVReader reader = new CSVReader();
        reader.Load(path);

        // 取り出し例
        reader.GetString(0, 2);

以上になります。

 

微妙に中身が違いますが、今回のソースです:

– https://github.com/ookumaneko/Blog_Unity/blob/master/CSVReader.cs