20201028のUnityに関する記事は11件です。

VSCodeでUniRxが参照エラーになる件について

現象

UnityでUniRxを使って開発していたら
突然VSCodeでUniRxのusingでエラーが発生した・・?
before.JPG

なぜなのか

結論から言うと
VSCode拡張のバージョンアップが原因らしい。

修正手順

サイドメニューから拡張機能を開き、C#を選択。
バージョンを確認するとv1.23.4だった。
extension_csharp.JPG

このバージョンをv1.23.2まで落とす。
拡張機能のC#の設定アイコンをクリックし、「install Another Version...」を選択。

バージョン選択の窓が表示されるため、「1.23.2」を選択してインストール。
後はVSCodeを再起動する。

おしまい!!
after.JPG

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

VSCodeでUnityの補完が上手くいかない時

import文でそもそもエラーが起きてたりして全然補完してくれない現象が起きたが、VisualStudio for Macを入れてエディタを切り替えた後にVSCodeに切り替え直したら上手く動いた。

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

ユニティちゃんを動かす

似たような記事はゴマンとあるけど、毎回どうだったけー?と悩むので、自分用の備忘録として綴ることにする。

動作確認バージョン

Unity 2019.4.13f1

まず

Unityをたちあげ、新規で3Dのプロジェクトを開く。

地面を配置。
Hierarchy > 3DObject > Plane
Image from Gyazo

AssetStoreから
Unity-Chan!Model
をダウンロード&インポートする。

Image from Gyazo

Project > Asset >UnityChan! > UnityChan!Model > Prefabs
にあるunitychan_dynamic をシーンにドラッグする。
(2つユニティちゃんのPrefabがあるが、dynamicの方が新しいらしいので、dynamicにした)
Image from Gyazo

Play

Image from Gyazo

おっと、
ユニティちゃんが後ろ向きなので、RotationのYを180にセット。
Image from Gyazo

再度、Playすると、正面向いた。
Image from Gyazo

UNityちゃんを選択した状態で
inspector > Add Component
RigidbodyとCapsule Colliderを追加

Image from Gyazo

使わないので、
unitychanのInspectorの Idle Changer、Face Update、Auto Blinkのチェックをはすず。(または削除する)

アニメーション

Project > Asset >UnityChan! > UnityChan!Model > Art > Animations > Animators

project +
Animation Controller

できたファイルをクリック

名前を Walkとする。(なんでもいい)

こんな画面

Image from Gyazo

画面を右クリック
Create State > Empty

New State があらわれる
Image from Gyazo

名前を Idle に変更し、
Motionを WAIT00を選ぶ (なんでもいいけど)

Image from Gyazo

新しく
画面を右クリック
Create State > Empty

名前をWalk、MotionをWALK00_F

Image from Gyazo

IdleとWalkの間に双方向の矢印
(右クリック Make Transition)

Image from Gyazo

parameterの右下にある +をクリック
Image from Gyazo

Boolを選択

Idel -> Walkの 矢印をアクティブにしたまま、

1、名前を is_walking、
2、Has Exit Timeのチェックを外す
(なぜかわからないけど、チェックがあると、スムーズに歩き出さない)
3、conditions を is_walking trueに

Image from Gyazo

Walk -> Idle の
conditions を is_walking falseに

Image from Gyazo

UnityChanの Inspectorの
Animator > Controller を
先ほど作った Walkに
Image from Gyazo

スクリプト

Walk.cs
using UnityEngine;
using System.Collections;

public class Walk : MonoBehaviour
{

    private Animator animator;
    // Use this for initialization
    void Start()
    {
        animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey("up"))
        {
            transform.position += transform.forward * 0.005f;
            animator.SetBool("is_walking", true);
        }
        else if(Input.GetKey("down"))
        {
            transform.position -= transform.forward * 0.005f;
            animator.SetBool("is_walking", true);
        }
        else
        {
            animator.SetBool("is_walking", false);
        }
        if (Input.GetKey("right"))
        {
            transform.Rotate(0, 0.2f, 0);
        }
        if (Input.GetKey("left"))
        {
            transform.Rotate(0, -0.2f, 0);
        }
    }



}

このスクリプトをUnityChanにアタッチする。

Image from Gyazo

プレイ

ユニティちゃんが、キー操作で歩いた!
Image from Gyazo

カメラ追随

メインカメラをUnityChanの子オブジェクトにする。

Image from Gyazo

カメラの位置を合わせる。
Rotaionも合わせたらいいと思う。(これは ROTAION X:10, Y:0, Z:0)
Image from Gyazo



できた。

Image from Gyazo

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

UnityのポップアップUIをスクリプトなしで作る

ポップアップウィンドウはウィンドウの外をクリックすると閉じて欲しいです。
この機能はuGUIで簡単に作れるので、備忘録の意味を込めて記事にします。
2020-10-28_21h21_02.gif

  • ステップ1

UIパネルがあった時、3つのパネル(Popup、Background、Popup_panel)を作り、画像のように配置する。
2020-10-28_20h57_33.png
ポイント
基本的に、ヒエラルキーの順番で上から描画されるので、ヒエラルキーでUIの下にPopupを置くとPopup表示時に表示で下にあるUIが反応しないようになります。
(言い換えると、ヒエラルキーで下にあるUIが前面にくる)

  • ステップ2

BackgroundはUI全体を覆う大きさにする。
BackgroundにButtonコンポーネントをつけて、クリックしたらPopupオブジェクトのアクティブがfalseになるようにする。
2020-10-28_20h58_17.png
ポイント
ヒエラルキーでBackgroundの下にPopup_panelがあるので、Popup_panelが前面にくる。
これにより、Popup_panelをクリックしてもBackgroundは反応しないが、Popup_panelの外をクリックすると、Backgroundのボタンが押され、Popupの表示が消える。

完成
Popup_panelを画面サイズより少し小さくすると、それっぽいものが完成します。
見た目の変化を見るために適当にボタンとテキストを追加して動かしたのが以下の動画です。
2020-10-28_21h15_30.gif
UIにPopupのアクティブをtrueにするボタンをつけて、Popup_panelにアクティブをfalseにするボタンをつけると、記事の最初のようなUIが出来ます。

参考ページ
uGUIの描画する順番

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

Performance Testing Extensionの導入メモ

はじめに

Unityでベンチマークをとるにあたり、以下の記事にあるPerformance Testing Extensionを試してみたので手順をメモしておく。
https://blogs.unity3d.com/jp/2018/09/25/performance-benchmarking-in-unity-how-to-get-started/

記事作成日(2020/10/28)時点で最新のドキュメントは以下の通り。(バージョン 2.3.1 preview)
https://docs.unity3d.com/Packages/com.unity.test-framework.performance@2.3/manual/index.html

手順

ドキュメント通りに設定すればいいが、わかりやすいようにキャプチャもつけてメモしておく。

manifest.jsonにパッケージを追加

パスは {Project}/Package/manifest.json にある。

manifest.json
{
  "dependencies": {
    "com.unity.test-framework.performance": "2.3.1-preview",
  }
}

TestRunnerの準備

使用するパッケージはドキュメントに書いてある通り、TestRunnerの拡張機能なため、TestRunnerの準備をする。

The Performance Testing Extension is intended to be used with, and complement, the Unity Test Runner framework.

TestRunnerについては以下の記事を参照するとわかりやすいため詳細は割愛する。
https://light11.hatenadiary.com/entry/2020/07/01/200253

アセンブリに参照を追加

テスト用のAssembly Definition FileのAssembly Definition Referencesに Unity.PerformanceTesting を追加する。

スクリーンショット 2020-10-26 19.15.11.png

Assembly Definitionについては以下の記事を参照するとわかりやすい。
https://qiita.com/toRisouP/items/d206af3029c7d80326ed

テストコードを書く

テストするメソッドに Performance 属性を追加する。
詳細はドキュメントのサンプルを参照のこと。
https://docs.unity3d.com/Packages/com.unity.test-framework.performance@2.3/manual/index.html#taking-measurements

Test.cs
[Test, Performance]
public void Test()
{
    Measure.Method(() => { ... }).Run();
}

テスト実行

TestRunnerを実行すると、TestReportでパフォーマンスの結果を確認することができる。
メニューの Window → Analysis → Performance Test Report からウィンドウを開くことができる。

テストの結果は以下のドキュメントのように表示される。
https://docs.unity3d.com/Packages/com.unity.test-framework.performance@2.3/manual/index.html#viewing-performance-test-report

詳細はドキュメントを参照のこと。
https://docs.unity3d.com/Packages/com.unity.test-framework.performance@2.3/manual/index.html#output

番外編

テスト用のアセンブリで MessagePack for C# を参照する時に必要なものをメモしておく。
必要なのは以下の3つ。

  • Assembly Definition References
    • MessagePack
    • MessagePack.Annotations
  • Assembly References
    • System.Memory.dll

スクリーンショット 2020-10-26 19.43.46.png

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

Unity Hubを出さずにプロジェクトを開くと楽

Unity Hubでプロジェクトを選択するのは面倒です。
Unity Hubを出さずにプロジェクトを開く方法の紹介です。

環境は Windows 10 です

方法1 シーンアセットをダブルクリックする

エクスプローラーにて
シーンアセット .unity ファイルをダブルクリックする方法です。
.unityファイルがUnityEditorに関連付けされている必要があります。

おすすめは次の方法2です。

方法2 batファイル作成

次のようなテキストを 好きな名前.bat で保存します。メモ帳でOKです。

start "" "C:\Program Files\Unity\Hub\Editor\2020.1.0f1\Editor\Unity.exe" -projectPath "d:\game"

バージョンやプロジェクトは書き換えてください。
start "" は、これをしないとUnity実行中に黒いウィンドウが残ってしまいます。

また、batファイルの実行をスタート画面に登録することも可能です。

エクスプローラにて、保存したbatファイルを右クリック > ショートカットの作成
ショートカットを右クリック > プロパティ > リンク先先頭cmd /c(スペース) を追加しOK

もう一度ショートカットを右クリックしスタート画面にピン留めする
タスクバーにD&Dしてピン留めすることも可能です。

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

UnityからのWebSocket接続時にハンドシェイクでエラーが出た際の対処法

websocket-sharpを使ってWebSocketに接続

websocket-sharpはUnityで使えるWebSocket接続用のライブラリ。
基本的な使い方は以下の通りで、WebSocketインスタンスを作ってURLを引数として渡し、Connectメソッドで接続するだけと非常にお手軽。

WebSocketController.cs
using System;
using UnityEngine;
using WebSocketSharp;

public class WebSocketController : MonoBahaviour
{
    private WebSocket webSocket;

    // wssから始まるWebSocketの接続先URL。
    private string baseURL = "wss://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";

    // WebSocketインスタンスを作成し、接続先URLを渡す。
    webSocket = new WebSocket(baseURL);

    // WebSocketへ接続。非同期で行いたい場合はwebSocket.ConnectAsync()を使う。
    webSocket.Connect();
}

An error has occurred during a TLS handshake.

接続をしようとすると上記のエラーメッセージが出た。
URLがwssから始まるセキュア通信用のプロトコルだったため、webSocketインスタンスをセキュア通信ができるように弄ってあげる必要があるみたい。
そこで以下のようにコードを修正。

WebSocketController.cs
using System;
using UnityEngine;
using WebSocketSharp;

public class WebSocketController : MonoBahaviour
{
    private WebSocket webSocket;

    private string baseURL = "wss://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";

    webSocket = new WebSocket(baseURL);

    // この一文を追加する。
    webSocket.SslConfiguration.EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12;

    webSocket.Connect();
}

webSocket.SslConfigurationはセキュアな通信を確立するために使われるクラスで、その中のEnabledSslProtocolsというプロパティが認証用のプロトコル(SslProtocols 列挙型)を格納するプロパティとなっている。

そこへSslProtocolsの「Tls12」をセットしてあげることで、セキュアな通信ができるようになる。

あとは通常時と同じくConnectメソッドで接続してあげればエラーは解消された。

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

UnityでAndroidのプラグインのクラスが見つからなくて(ClassNotFoundException)何故か使えないときに怪しむべきProGuard、Minify

Androidのプラグイン何故か使えない

俺は完璧に設定しているのにビルドして実行するとClassNotFoundExceptionでAndroidプラグインが使えないことがあって時間を費やしたのですが、いろいろ調べた結果ProGuardのMinifyという処理が原因でした。ClassNotFoundExceptionの原因調べててProGuardまでたどり着かなくね?という懸念があったので共有します。
自分がたどり着いたのはこれにProGuradの記述があったからです。。。

リリースビルドはMinifyが有効になっている

デフォルトの状態でリリースビルドするとProGuardによるMinify処理が行われるようになっているみたいです。
チェックが入っていてMinifyを切るとプラグインの機能が使えるようになりました。
スクリーンショット 2020-10-28 16.45.17.png

ProGuardって何?

ProGuardはアプリのアプリの圧縮、難読化、最適化の機能みたいですね。
アプリの圧縮、難読化、最適化
この処理によってプラグインで使っている機能まで取り去られるみたいなことが起きているみたいです。

ProGuardの設定

ProGuardの設定ファイルを作成することで勝手に処理されない部分を指定できるようになっているようです。Minifyを切ってしまうとこの機能の恩恵が受けられなくなるのでこの方法で対処するのがベターなのではないでしょうか。

スクリーンショット 2020-10-28 16.46.14.png

この Custom Proguard File というチェックをつけるとproguard-user.txtが作成されるのでそれを編集することで設定できます。

proguard-user.txt
-keep class android.support.v4.content.** {
    *;
}

例えばandroid.support.v4.contentでClassNotFoundExceptionが出ていた場合はこんなふうに指定する感じです。この状態でビルドするとMinify対象外になる感じですかね。別の書き方もあるようですので、リンクを参考してください。

まとめ

  • 何故かClassNotFoundExceptionが出たときはMinifyを疑ってみよう。
  • ProGuardの設定で対処しよう。
  • これわかりづらいから何とかならんのか。。。

参考

Unity に Admob 実装した時、Proguard や Minify を無効にせずに Releaseビルドする方法
Unity Android ビルドの Minify オプションの罠

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

Unityアセットの宴でシーンを超えてデータを参照する方法

AdvEngineの中にAdv Save Manager、Adv System Save DataというのがあるのでそれぞれのDirectory Name、File Nameをすべてのシーンで合わせれば同じデータを参照することができる。
1.png

Adv Save Managerはシナリオ単位での保存データで、Adv System Save Dataはコンフィグ関連の保存データだと思う。
同じシーンのAdvEngineオブジェクトをコピーすれば何ということはないと思うのだが自分はDirectory Nameが違っていたせいでエラーになっていた。いったいどこから持ってきたんだ…

ちなみにセーブデータは設定したフォルダ名、ファイル名で以下のように保存される。
2.png

宴はいろいろ難しすぎて眠くなる。

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

Unity 立方体でそれぞれにテクスチャを貼る方法

久々の投稿ですわ。 

今回は 立方体で別々にテクスチャを 

貼る方法を見ていきます。 

キューブにテクスチャを貼ってしまうと 

1枚絵になってしまうので  

別々に貼ることはできません。 

しかし、 plainやクアッドを使って 

立方体を作れば、それぞれ貼ることが可能です。 

こちらの画像のようにすることができます。 ↓

bandicam 2020-10-28 15-12-08-148.jpg

左がキューブにマテリアルを貼ったもの 

右がplainでキューブを作り 

画像やマテリアルを貼ったものになります。 

作り方ですが まずplainを6枚用意して 

キューブのように設置します。

ギズモなどを使い、視点移動しながらやれば 

やりやすいです。

この画像のやつだと、拡大縮小を全部0.1に 

設定しています。 

あとは 空のオブジェクトを作って 

その中にplainを全部入れて、親子関係にすれば 

完成です。 

しかし、 この状態ですと

マテリアルや画像をplainに貼ると 片方にしか 

表示できないという 問題が起きます。 

なので、両面に表示する方法も見ていきましょう。 

両面にするには シェーダーを変えてあげる必要があります。 

プロジェクトビューで「Create」→「Shader」→「Unlit Shader」

を選んでください。 

日本語だと、光学処理のないシェーダー となっているので 

そちらを選択します。 

では、UnlitShaderを入れたら ダブルクリックをして 

開きましょう。 

開いたら、次にコードを変更します。 

すでにあるコードを消して 

こちらのコードを入れてください。 

Shader "Unlit/culloff" //変更部分
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
//変更部分↓

Tags { "RenderType" = "Transparent" "Queue" = "Transparent" }
LOD 100
Cull off
Blend SrcAlpha OneMinusSrcAlpha

Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog

#include "UnityCG.cginc"

struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};

struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};

sampler2D _MainTex;
float4 _MainTex_ST;

v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}

fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
} 

ここまで 

変更部分と書いてあるところが追加したコードです。 

これはようするに、カリング設定をoffにしているわけですね。 

ではこちらを入れたら、保存して閉じます。 

あとはplainを選択して、 今作ったシェーダーを入れてあげれば 

OKです。 

これで、両面にマテリアルが反映されました。

bandicam 2020-10-28 15-30-51-204.jpg

PS 

すでにご存じの人も多いでしょうが 

Unity2Dゲームstandard講座 発売中です。 

2Dゲームやboltに興味のある人はどうぞ
https://coconala.com/services/40431

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

MRTKの音声認識を使用してみた!

image.png
この記事は、MRTKで音声認識を行いたいが実装方法が分からない方やMRTKのDictationHandlerの使用方法が分からない方が対象になっています。

使用方法を理解するために、簡易的にオブジェクトを配置し音声認識を行い、テキスト化するという流れで実装を行っていきたいと思います。

実装環境

Unityバージョン 2019.4.6f1
MRTK2.4.0

概要

音声認識を行う方法は複数あり、AzureSpeechServicesでの音声認識の方法も確立していたが、MRTKによって音声認識を行いたかった。
理由としてはAzureSpeechServicesによる音声認識も容易に行うことが出来るが、Azureへの登録が必要であり無料の期間も1か月しかないため。

MRTK(Mixed Reality Toolkit) とは、Mixed Reality アプリケーション向けのオープンソースクロスプラットフォーム開発キット(SDK)です。
image.png
MRTKには、様々なHandlerが用意されていて、これを利用することによって簡単に入力イベントに対しての処理を行うことが可能になります。
今回はMRTKのDictationHandlerを利用して、音声認識を行ったが、MRTKには様々なHandlerが用意されている。

Handlerの種類
Dictation Handler: 文字起こしの開始や終了,その結果を受け取る
Eye Tracking Target: 視線が合った時や離れた時のイベントを受け取る
Input Action Handler: 入力の開始と終了を受け取る
Manipulation Handler: オブジェクトをジェスチャーで移動したときのイベントを受け取ることができるだけでなく,オブジェクトを操作可能
Pointer Click Handler: ポインタでクリックしたときのイベントを受け取る
Speech Input Handler: 音声コマンドの認識結果を受け取る
Touch Handler: 手で触ったりしたときのイベントを受け取る
Handlerの説明についてはこちらの技術記事を参考にした

実装手順

最終的なイメージとしてはこんな感じ
image.png
1. Unityのプロジェクトを作成し、MRTKをインポートする
Microsoft公式チュートリアルの2,3を参考にして、プロジェクトの設定を行う。
2.必要なオブジェクト
ボタンなど配置や配色を適当で決まりはないです。
・Dictation
   ・空のGameObjectを作成しDictationに名前を変更→TextPlateの作成(cubeを変形させて適当なサイズにする)
   ・TextPlateの中になんでも良いのでTextオブジェクトを追加
      MRTKの既存のテキストを使用
・ボタン
   ・今回は、MRTKの既存のボタンを使用した
      音声認識をスタートさせるボタン
      音声認識をストップさせるボタン
      それぞれを用意する
3.DictationHandlerをオブジェクトにアタッチする
アタッチしたら、出力させたいtextオブジェクトを付与する。
ディクテーションのサービスのセットアップをする
下図の一番下のWindowsDictationInputの中の設定を変える
2020-10-27-16-37-06.png
設定後、DictationHandlerスクリプトを使って録音セッションの開始と停止や、UnityEventsを通じた文字起こし結果の取得が可能になる。
各機能の説明として公式による説明を引用

Dictation Hypothesis:ユーザーが話すにつれて、これまでキャプチャされた音声の初期の粗いトランスクリプションとともに発生されます。
Dictation Result:各センテンスの終わり (すなわち、ユーザーが間を置いたとき) に、これまでキャプチャされた音声の最終トランスクリプションとともに発生されます。
Dictation Complete:録音セッションの最後に、音声のすべての最終トランスクリプションとともに発生されます。
Dictation Error:ディクテーション サービスでのエラーを通知するために発生されます。この場合のトランスクリプションには、エラーの説明が含まれています。
2020-10-27-16-41-20.png
4. ボタンの処理
ボタンを追加し、押されたときにDictationHandlerのStartRecordingメソッドが実行されるように設定する。
同様にストップボタンが押されたときの設定に、StopRecordingメソッドが実行されるよう設定
2020-10-27-16-43-31.png
それでは実行してみよう!
2020-10-27-16-44-37.png

感想

音声認識の精度が良い、日常使用する言葉のレベルなら容易に漢字に変換することも可能であった。
そして、コーディングを行わなくても、音声認識が簡単に実装できるのが凄い所だと感じた。
課題としては、このテキストをどのように扱い利用していくかだと考える。
Hololensを使用した感触として、キーボード入力は向いていないと考えているため、
音声認識などの入力が重要となってくるのではないかと考える。
MRTKで可能な事を知っておくことによって、開発の工数が減らすことができるため機能を理解していることは重要だと思う。
そして、今回はUnityEditor上での使用だったのでHoloLensにビルドして動作するのかを確かめる必要がある。

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