20201112のUnityに関する記事は5件です。

Unity 2D #3 androidにおけるjsonファイルの読み書き

androidではStreamReaderによるIOができません。そのため、unityのEditorとjsonファイルの読み方を変えなければなりません。

以前のUnity 2D #2で作成したCharacterTableのjsonファイルをandroidでも読み込めるようにします。

CharacterTableの概要

[System.Serializable]
public class CharacterTable{
    public List<CharacterIndividual> characters;
}

[System.Serializable]
public class CircleIndividual {
    [SerializeField] public int Id;
    [SerializeField] public string Name;
}

CharacterTableの読み込み

IEnumerator CharacterStatusSet()
{
CharacterTable gettwo;
string filePath = Application.streamingAssetsPath+"/Characters.json";
#if UNITY_EDITOR
    StreamReader reader = new StreamReader(filePath);
    string getone = reader.ReadToEnd();
    reader.Close();
    gettwo = JsonUtility.FromJson<CharacterTable>(getone);
#elif UNITY_ANDROID
    UnityWebRequest www = UnityWebRequest.Get(filePath);
    www.SetRequestHeader("Content-Type", "application/json");
    yield return www.SendWebRequest();
    string tmptext = www.downloadHandler.text;
    gettwo = JsonUtility.FromJson<CharacterTable>(tmptext);
#endif

// gettwo.characters[0].Name
// 炎の魔術師

yield return null;
}

 #if UNITY_EDITOR ~ #elif までに記述したコードはunityのeditor上で実行され、android端末で実行したときは#elif UNITY_ANDROID ~ #endif までに記述したコードが実行されます。
また、jsonファイル(Characters.json)はAssetsフォルダ直下にStreamingAssetsフォルダを作成し、その中に入れています。
Assetsフォルダ直下にjsonファイルを配置し、filePathをApplication.dataPath+"/Characters.json"とした場合、androidとeditorでApplication.dataPathが示す場所が異なるため、android端末でうまく読み込みすることができません。

また、関数CharacterStatusSetは

StartCoroutine(CharacterStatusSet());

で呼び出すコルーチンとなっており、CharacterStatusSetを普通の関数で記述してしまうと、これもファイルの読み込みが失敗する原因の一つとなってしまいます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MRTK v2+TextMeshProでBody-Lockedな文字列を作る

自分でやったことを忘れないための備忘録
Unity 2019.3.15f1
MRTK v2.4.0
詳しくはmicrosoft公式チュートリアル に書いてある構成を見てください。。。
MRTKv2を使って、自分の頭に追従してくれる文字列を作る方法。こんな感じになる。
GIF 2020-11-12 12-29-09.gif
やり方

  1. Hierarchyを右クリック>3D Object>Text-TextMeshProを選択
  2. Textフィールドに文字列を入力し、フォントサイズや効果をいい感じに調整
  3. Rect Transform>Width,Heightから文字列の領域を設定。できれば文字列ギリギリになるように設定すると見た目がいいスクリーンショット 2020-11-12 124633.png
  4. Add ComponentからOrbital(Script)を追加。一緒にSolverHandlerも追加されるInspector>Orbital>Local Offsetでmain cameraから見た文字列の保持位置を設定できる。Xは3.で設定したWidthの半分にするとよい。y,zはPlayモードを見ながら調整する。スクリーンショット 2020-11-12 125306.png
  5. Add ComponentからBillBoard(Script)を追加。Pivot AxisをFreeにセットし、Target Transformに文字列自身を設定する。

やり方は以上。Playモードで感触を見つつ微調整をいれるとよい。使用しているツールのバージョンによってはうまく動かないかもしれない。
参考にしたサイトを以下に載せるので、うまく動かなければ参照して試行錯誤してほしい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity 2D #2 jsonファイルの読み書き

unityでjsonファイルをデータベースのように使いたいと思います。

データの保存について

データの保存はクラス内容の保存という形で実行されます。例として、以下のクラスを考えます。

[System.Serializable]
public class CharacterTable{
    public List<CharacterIndividual> characters;
}

[System.Serializable]
public class CircleIndividual {
    [SerializeField] public int Id;
    [SerializeField] public string Name;
    [SerializeField] public int Width;
    [SerializeField] public int Height;
    [SerializeField]public int[] Points;
    [SerializeField]public string[] ComboType;
    [SerializeField]public float[] ComboEffect;

    public CircleIndividual(int id, string name, int width, int height, int[] points, string[] comboType, float[] comboEffect){
        this.Id = id;
        this.Name = name;
        this.Width = width;
        this.Height = height;
        this.Points = points;
        this.ComboType = comboType;
        this.ComboEffect = comboEffect;
    }
}

ここで、CharacterTableはCharacterIndividualをまとめているだけで不要に感じるかもしれませんが、データの保存のためには、CharacterTableのようにクラスを包含する一回り大きいクラスが必要となります。
また、詳しい説明は避けますが、[System.Serializable]も上のように書いてある必要があります。(publicである必要もある)
そのため、試したい方は注意してください。

string characters_path = "/Characters.json";
int Characterindex = 0;
CharacterTable characterTable = new CharacterTable();

characterTable.characters = new List<CharacterIndividual>();
AddCharacter("火の魔法使い", 100, 50, new string[] {"atkup1"}, new float[] {50});
AddCharacter("水の魔法使い", 120, 40, new string[] {"defup1", "atkup1"}, new float[] {20, 20});
AddCharacter("雷の魔法使い", 80, 60, new string[] {"defup1"}, new float[] {30});

string characters_jsonToSave = JsonUtility.ToJson(characterTable);

// Save
StreamWriter characters_writer;
characters_writer = new StreamWriter(Application.dataPath + characters_path, false);
characters_writer.Write(characters_jsonToSave);
characters_writer.Flush();
characters_writer.Close();
void AddCharacter(string name, float hp, float attack, string[] skillType, float[] skillEffect){
    // id, name, hp, attack, skillType, skillEffect
    CharacterIndividual chara = new 
    CharacterIndividual(Characterindex, name, hp, attack, skillType, skillEffect);
    characterTable.characters.Add(chara);
    Characterindex++;
}

上のコードのようにデータを作成し、内容を保存しました。
Application.dataPathはunityでのパスを表すもので、何も設定することなく使用可能です。上のコードだとAssetフォルダ直下にjsonファイルが保存されるはずです。
完成したjsonファイルは以下の通りです.

{"characters":[
  {"Id":0,"Name":"火の魔法使い","HP":100.0,"Attack":50.0,"SkillType":["atkup1"],"SkillEffect":[50.0]},
  {"Id":1,"Name":"水の魔法使い","HP":120.0,"Attack":40.0,"SkillType":["defup1","atkup1"],"SkillEffect":[20.0,20.0]},
  {"Id":2,"Name":"雷の魔法使い","HP":80.0,"Attack":60.0,"SkillType":["defup1"],"SkillEffect":[30.0]}
]}

データの読み込みについて

保存したjsonファイルの中身は以下のように読み込みます。

StreamReader reader = new StreamReader(Application.dataPath+DataHandring.characters_path);
string JsonText = reader.ReadToEnd();
reader.Close();
CharacterTable ReadCharacterTable = JsonUtility.FromJson<CharacterTable>(JsonText);

// ReadCharacterTable.characters[0].Name
// 火の魔法使い

また、c#スクリプトの上部に

using System;
using UnityEngine;

を記載するのを忘れないようにしてください。(他にも必要だったかもしれない)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity】最速でテキストで日本語を使えるようにする方法(自分用)

通常のTextでは日本語が使えない為、テキストメッシュプロ(TMP)を使う。

まずは左上にある「Create」→「UI」→「Text-TextMeshPro」の順で押していく。

そうするとTextMeshProの素材をImportする為のポップアップが表示されるので「import TMP Essentials」を押す。

“shot” 2020-11-11 23.42.33.png

その後「Window」→「TextMeshPro」→「FontAssetCreator」の順番に押していく。

↓の画像のウインドウが出てくる

“shot” 2020-11-11 23.51.40.png

「Source Font File」利用したいフォントを入れるところ。(ttf, otfのファイルのみ)
「Padding」文字同士の間隔の設定する場所。数字が小さいとかぶってしまうので調整する。
「Atlas Resolution」文字を保存するテクスチャサイズ。日本語は文字数が多いので8192×8192にしておく。
「Character Set」日本語で生成する為、「Custom Characters」にする。

おすすめフォントサイト
ここで適当に使いたいフォントを探す。
利用したいフォントを「Source Font File」に入れる。

次に日本語の文字が使えるように文字データを登録する。
↓のサイトから日本語をコピー。
japanese_full.txt
↓ここにペースト。そして「Generate Font Atlas」を押す。少し時間がかかるので待つ。
“shot” 2020-11-12 1.36.52.png

終わったら「Save As」を押す。

そしたら↓のようなファイルができているので
“shot” 2020-11-12 1.39.57.png

それをテキストメッシュプロの「Font Asset」にドラッグ&ドロップ

“shot” 2020-11-12 1.42.50.png

以上。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Oculus Quest2 Unity開発でつまづいたとこ

はじめに

Oculus Quest2を買いました。

quest2.jpg

早速Unityでなんぞ作ろうと思ったのですがセットアップでちょくちょく躓いてしまいました。のでその解決法を共有したいと思います。詳細な手順というよりかはTips的な記事です。

Quest2とスマホアプリがペアリングできない

スマホアプリ側でFacebookアカウントを通すことが出来たらスマホアプリとQuest2をペアリングする必要があります。この時スマホアプリ側でQuest2が見つからないという問題がありました。

解決法

私はiPhoneを使用しているのですが、アプリのアクセシビリティ設定でOculusアプリのBluetoothアクセス許可がオフになっていました。「設定」画面の下の方に各アプリの設定があるのでそこからOculusアプリのBluetoothアクセス許可をオンにしたら直りました。Quest関係ねーじゃん。

UnityでビルドしたアプリがQuest2で動かない

大体の手順はこちらが非常に参考になります。こちらのページを元に進めれば大体OKです。しかしビルドして転送するところまではできたのですが、Quest2上でアプリが実行されると真っ暗で何も見えない状態になってしまいました。

解決法

「Oculus XR Plugin」パッケージのバージョンが低かったのが原因でした。上記のページにも書いてあるのですが、このパッケージはバージョンが1.4.0以降でないと動かないのですが、PackageManagerから入れる際のデフォルトのバージョンが1.3.4になっていました。プルダウンを開くと1.5.0が出てくるのでこちらを入れましょう。普通逆じゃない?
image.png

Unityエディタで再生できない

Quest2をLinkケーブルで繋ぐとPCヘッドセット(通常のRift)として使えるので、ビルドせずともQuest2上でシーンを再生できます。できませんでした。

解決法

1.Oculusアプリを入れる

Quest2をPCヘッドセットとして使用するのはOculus Linkという機能によって実現されるのですが、この機能を使用するためにはOculusアプリをPCに入れる必要があります。こちらからアプリを入れましょう。アプリがインストールされたらLink機能を使うことが出来ます。Link接続をするかどうか尋ねるポップアップがQuest2上で表示されるのでそこからLink接続をすることができます。ポップアップが出てきない、もしくは間違って消してしまった場合はQuest2ホームの設定画面から接続することが出来ます。Link接続がされるとQuest2のホームではなくRiftのホームが表示され、バーチャルデスクトップ等の機能を使うことが出来ます。ブラインドタッチに自信のある方はバーチャルデスクトップで開発をすると被ったり外したりする手間が無くなるので便利だと思います。目が死にますが。

Oculusアプリのバージョンは最新にしておきましょう。「ライブラリ」→「アップデート」からアップデートすることが出来ます。また、「設定」→「一般」から提供元不明のアプリを実行できるようにしておきましょう。これは不要なのかもしれませんが、私は「ベータ」の公開テストチャンネルもオンにしました。

2.再起動

Quest2とPCを再起動しましょう。以上でエディタからQuest2の再生ができるはずです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む