20201019のUnityに関する記事は9件です。

【Unity】Randomまとめ

はじめに

ゲーム製作においてRandomを使用する場面は多いと思います。
備忘録としてRandomクラスをまとめてみました。
なお、本記事ではUnityEngine.Randomについて記載しています(System.Randomではない)。

Static Properties

insideUnitCircle

半径1の円の内部の点をランダムに返す。
円形上にランダムに敵を出現させたい場合などに使用。
image.png

insideUnitSphere

半径1の球体の内部の点をランダムに返す。
球体内部全てなので、浮いてるオブジェクトなどにも使用可能。
スクリーンショット 2020-10-19 22.12.18.png

onUnitSphere

半径1の球体の表面上の点をランダムで返す。
スクリーンショット 2020-10-19 22.14.24.png

rotation

ランダムなQuaternionを返す。
スクリーンショット 2020-10-19 22.16.37.png

rotationUniform

一様な分布でランダムにQuaternionを返す。
Random.rotationでは完全なランダムではないみたいです。ただ計算コストはこちらの方が高い。

state

乱数生成器の内部状態のすべてを取得、または、設定する。
適当なタイミングでアプリを落としても、再度起動したときに続きからできるようにするために乱数を保存する。

value

0.0と 1.0の範囲のランダムな数を返す。
0.0と1.0も含むことに注意。汎用性が高く、Randomクラスのプロパティで基本的に使うのはこれ。

Static Methods

ColorHSV

HSVでアルファ値(透明度)をもつランダムなColorを返す。
パラメータで色相(hueMin,hueMax)、彩度(saturationMin,saturationMax)、明度(valueMin,valueMax)、アルファ値(透明度:alphaMin,alphaMax)を設定可能。
スクリーンショット 2020-10-19 22.51.41.png

InitState

シード値を指定し、ランダム数生成器の状態を初期化する。
システム時刻等で決定されるシード値を指定することで、同じ乱数の値を生成することができる。
シード値による擬似乱数については、以下の記事がわかりやすいです。
コンピューターの「ランダム」は本当にランダムなのか?

Range

範囲を指定できる、Random.value
intで設定するか、floatで設定するかによって、戻り値の範囲に差がある点に注意。

int設定
\text{min}\leqq \text{return} < max
float設定
\text{min}\leqq \text{return} \leqq max

まとめ

  • Randomクラスは様々な乱数を生成するクラス。
  • Random.valueRandom.Rangeの使用頻度が圧倒的に高い。
  • Random.rotationRandom.rotationUniformの違いは後日検証したい...
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

collisionEnterで、当たったオブジェクトの名前を出力する

コード

void OnCollisionEnter(Collision collision)
{
  string hitObjectName = collision.gameObject.name; //当たったオブジェクトの名前
  Debug.Log(hitObjectName);
}

thisはscriptをアタッチしたオブジェクトの名前が出力される

void OnCollisionEnter(Collision collision)
{
  if(collision.gameObject.tag == "Player")
  {
   string thisOjectName = this.GetComponent<Collider>().gameObject.name;
   Debug.Log(thisObjectName);
  }
} 
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity オブジェクト間の距離を求める

オブジェクト間の距離を求めるにはVector3.Distanceを使う。(今日知った泣)
スクリーンショット 2020-10-19 21.10.19.png

using UnityEngine;
using UnityEngine.UI;

public class DistanceController : MonoBehaviour
{
    public GameObject MajorObj;
    public GameObject Surface;
    public Text MajorText;

    // Update is called once per frame
    void Update()
    {
        Vector3 Apos = MajorObj.transform.position;
        Vector3 Bpos = Surface.transform.position;
        float dis = Vector3.Distance(Apos, Bpos);
        MajorText.text = "現在の距離: " + dis+ "m";
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VuforiaをSampleからやってみる

まえがき

ARコンテンツを簡単に作成することができるVuforia.
特徴は対応機種の多い,Unityに統合されている,比較的精度が良い等があげられます.
以前にも使ったことがあるのですが,機能も増えてさらに使いやすくなっているようです.
Sampleも充実しているので,一から試していこうと思います.

本題

AndroidでVuforiaのSampleをビルドして試す
(※IOSへのビルドは少し異なります)

機器概要
機器 バージョン
Android 10
Windows10 Laptop ---
Unity 2019.3.2f1
Android Stadio ---

手順

1. UnityでAndroidビルド環境を設定

詳しくは別記事に記載予定
・Android Stadioのインストール
・使用しているUnityのバージョンにAndroid用の設定をインストール

2. projectを新規作成
3. Player settingsからAndroid用にSwitch

image.png

4. Asset StoreよりVuforiaSampleをImport

image.png

※Vuforia単体の場合はAssetStoreもしくはPackage ManagerからImport
image.png

image.png

5.ビルド

image.png

実行例と中身の確認

主なサンプルを試してみたのでまとめる
なおサンプルの画像はAsset/For Printの中にPDFファイルがあるので印刷して利用
専用のソフトなどは公式ページからDL

Image Targets(database)

画像をARマーカーとしてデータベースに登録し,Image targetとする
登録したImage targetの子オブジェクトとして表示させたいオブジェクトを配置することで追従させることが可能

Model Targets

3DオブジェクトをCAD形式で登録し,Model targetとする
その形状に合う物体をキャリブレーションさせることでトラッキングすることが可能

VuMarks

好きなマークやロゴを識別できる形式にしてマーカーとする
VuMarksを作成するには専用のソフトVuMark-Designerを利用する必要がある

Object Reco

スマホアプリのVuforia Object Scannerを利用
特徴点からtargetをスキャンすることでマーカーを作成可能

Multi Targets

Image Targetsの6面版
直方体のマーカーを認識することが可能

Cylinder Targets

円柱をマーカーとし,認識することが可能

マーカーの作成について

ARマーカーを作成するにはアカウントを作成し,データベースに画像,モデルなどを登録する必要がある.
詳しくは以前の記事準備を参照してください.

あとがき

サンプルをいじったりしてみましたが,以前触った時よりも格段に良くなっていますね.
さらにVuforia7あたりから新たな機能が追加されており,そちらも今後触ってみたいと思います.
(Area Target Generator,Model Target Generator, GroundPlaneとMidAirなど)
また,スタンプデバイスのトラッキングにも活用できればと考えています.

参考資料

Vuforiaでポジショントラッキングする手順とその周辺トピック
Vuforia7が結構すごいらしい
HoloLens製カートゲーム HADO KARTを現場に導入した話
Vuforia™トップ
Augment your spaces with Vuforia Engine
Automotive advantage: Vuforia Model Targets

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

【Unity2D】スペースキーでジャンプさせる

スペースキーの入力を受けとる

update関数の中にGetKeyDownでspaceキーの入力を受け取ります

void Update() {
  if (Input.GetKeyDown("space"))
          {

          }
}

Jump関数を作成

自身のRigidbody2Dを取得し、上方向に力を加えます。

Rigidbody2D rigidbody2D;

 void Jump()
    {
        // 上方向に力を加える
        rigidbody2D.AddForce(Vector2.up * 400);
    }

Jump関数を呼びだす

void Update() {
  if (Input.GetKeyDown("space"))
          {
            Jump();
          }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Unity]超絶初心者でもML-Agents Release8を動かす方法[Windows]

免責

この記事を見てる人は超絶初心者なので問題が起こったとしても私は責任を負わないこととします。また記事を見て進めた時点で同意したとみなします。またWindows以外のユーザーは今回扱いません。

バージョン確認

結構な速度で更新されてるML-Agentsですが2020/10/19時点の最新版であるML-Agents Release 8の環境構築とテストをしていきたいと思います。

実行環境

わかりやすく言うとインストールするものリストです。

バージョン インストール
ML-Agents Release 8
Unity 2019.4.1f1
Anaconda3 2020.7
Python 3.7.9

Unityは2018.4以降が対応してますが、
今回はUnity2019.4.1f1で進めていきます。
同様にPython3.6.1以降が対応してますが、
今回は仮想化とは???の人のためにAnacondaで仮想環境を作っていこうと思います。
Anacondaは後述で3.7環境を作るので、3.8対応の一番新しい2020.7(2020/10/19時点)を使います。
またUnityとUnity Hubはすでにインストールが済んでいる前提で進めます。
当然ですがネット環境も必要です。
今回GPUでの学習に関しては動かすことが目的なので含んでいません、予めご了承ください。

ANACONDA3インストール手順

既にインストール済みの方は飛ばしてください。
ダウンロード場所はAnaconda3のサイトをスクロールしたところにあります。
5.png
とりあえずNEXTで読み進めていってください。
1.png
今回はディレクトリを合わせるためJust Meで
3.png
インストール先のフォルダを聞かれますが今回はC:\Users\ ユーザー名\anaconda3に素直にインストールしましょう。
最後の項目ですが下の画像のようにチェックします。赤くなっていますが気にしないでOKです。
4.png
上の項目は面倒なパスを通すために必要で、下の項目はあまり関係がないのですが今回Python3.7をメインに使う都合上外します。
チェックでき次第インストールしましょう。
インストールが済んだらコマンドプロンプトを開いてcondaと打ち確認しましょう。
コマンドプロンプトがわからない方はWindowsの検索バーにcmdと打ちアプリを開きましょう。
6.png
開くと黒地に、
C:\Users\ ユーザー名>
と表示されているので
condaと入力してエンター、以下のようにヘルプが出力されればインストール完了です。
7.png

今後このようにコマンドプロンプトからコマンドを実行する際は、

$ conda

のように表記するので覚えておいて下さい。($は、続くコマンドを実行するの意味)

ML-Agentsダウンロード手順

すでにダウンロードしている方はディレクトリ階層だけ合わせてください。
ML-Agents Release 8のサイトをスクロールしてSource code(zip)をダウンロード、
C:\Users\ ユーザー名\ 直下に解凍しましょう。
7.png
ディレクトリはC:\Users\ ユーザー名\ml-agents-release_8 となるはずです。
フォルダ内のcom.unity.ml-agentsファイルはUnityで使います。

  • mlagents
  • mlagents_envs
  • gym_unity

のファイルは次のPythonのインストールの時に使います。
それぞれの働きについて詳しくはここを見てください。

Python3.7インストール手順

コマンドを実行します。

$ conda create -n ml-agents python=3.7

実行したら仮想環境の構築が終わるまでしばらく待ちましょう。
途中y/n?ときかれるので yを押してエンター
動作が終わると、再び
C:\Users\ ユーザー名> 
と表示されるのでそれから次のステップに移ります。
以降も同様に一つのコマンドの処理が終わるまで待ってから行ってください。

$ conda activate ml-agents

コマンドプロンプトが、(ml-agents)C:\Users\ ユーザー名> のように変化します。
これで仮想環境にライブラリを追加できます。

$ pip install -e ./ml-agents-release_8/ml-agents-envs
$ pip install -e ./ml-agents-release_8/ml-agents
$ pip install -e ./ml-agents-release_8/gym-unity

上から順に入れていきます。ちゃんとディレクトリ階層があっていればインストールが始まります。
時間がかかるので焦らずお茶を飲みましょう。

$ pip list

最後に追加したライブラリがあるか確認します。
8.png

Unityのテスト環境構築

Unity Hubを開いてプロジェクト>リストに追加をクリック。
12.png

C:\Users\ ユーザー名\ml-agents-release_8 内のProjectフォルダを選んで、フォルダーの選択。
11.png
Unityバージョンを2019.4.1f1に変更後、プロジェクト名をクリックして起動。
13.png
プロジェクトのアップグレードの確認をする。次に出てくるポップアップもYesを選択。
14.png
インポートが終わるまでお茶でも飲みましょう。
次に、Assets>ML-Agents>Examples>3DBall>Scenesフォルダから3DBall.unityをダブルクリックで実行します。
15.png
シーンが読み込まれたらUnity上部のPlayボタンを押して、シーンを実行してみます。
(少し読み込みがあるので待ちましょう)
17.png
可愛いシーンが再生されましたね!
このシーンには頭の上に乗ったボールを落とさないように学習済みのデータが設定されています。
ではPlayをもう一度押しシーンを終了して、1から学習してみましょう。
(ml-agents) C:\Users\ ユーザー名> の状態で

$ mlagents-learn ./ml-agents-release_8\config\ppo\3DBall.yaml --run-id=3DBall-1 --train

色々出てきた最後に、Start training by pressing the Play button in the Unity Editor.
と表示されたらUnityのPlayボタンを押してください。
そうするとボックス君たちが微振動を始めるかと思います。それが世界のおわr 学習の始まりです。
人によってはパソコンがブオーンと唸るかもしれませんが我慢です。(古いパソコンでさすがにヤバそうだったらPlayを停止するか、コマンドプロンプトでCtrl+Cを押して終了してください。)
しばらくはコマンドプロンプトとUnityを眺めててください。学習が終われば自動的に止まります。
コマンドプロンプトに表示されてくるMean Rewardが平均的な報酬ですので、これが高くなっていくようなら学習が順調に進んでます。

学習が終わると色々コマンドプロンプトに表示されたあと、(ml-agents) C:\Users\ ユーザー名> の状態に戻りますので、
C:\Users\ ユーザー名\results\3DBall-1ファイルを開きます。
18.png
3DBall.nnというNN形式のファイルが先ほどの学習で手に入った学習済みデータです。(NNはニューラルネットワークの意(Neural Network))
UnityのProject内にドラッグアンドドロップで移して、右クリックRenameで3DBall-NNと間違わないよう名前を変更します。
次にHierarchyから3DBallの右の矢印>をクリックして、3DBallのPrefabを開きます。
19.png
するとPrefabの設定画面に移るのでSceneの背景が青色に代わるのを確認した後、HierarchyからAgentを選択状態にすると、InspectorにBehavior Parametersというコンポーネントがあります。
20.png
そこのModelに先ほど追加した学習済みのNNファイルをドラッグアンドドロップ等で設定してください。
設定後Hierarchyの左上の小さな左矢印<でPrefabの設定画面から抜けます。
Unity上部のPlayを押してシーンを再生すると、Hierarchy内の3DBallが割り当てた学習済みファイルになってるのが確認できるかと思います。(見た目上大きな変化はないかもしれませんが、先ほど学習したデータです)

以上で学習のテストは終了です。
他にもデモシーンが用意されてるので学習時のシーンと.yamlの名前を変えながら試してみるとよいかと思います。

まっさらなUnityのプロジェクト構築

番外編ですが、デモシーン無しのまっさらなML-Agents用の新規プロジェクトの作り方です。
メニューからWindow>Package Managerを開きます。
左上の+ボタンを押してAdd package from diskを選びます。
9.png
C:\Users\ ユーザー名\ml-agents-release_8 に移動してcom.unity.ml-agentsフォルダ内のpackage.jsonを開きます。
10.png
インポートが終われば完了です。

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

[Mac]外部GPUを追加したが使われてなさそうだったときの対処法

img
https://www.amazon.co.jp/gp/product/B07CQG2K5K/

背景

ちょっと前に外付けGPUを購入したのですが、GPU使う系の処理をしてもなんか早くなってない気がする、、、と思ったら、アプリケーション側で下記の設定が必要なケースだったようで、備忘録。

対処方法

  1. 変更したいアプリケーションを右クリックでGet Info(日本語だと、「情報を見る」)
    Screen Shot 2020-10-19 at 15.01.29.png

  2. Prefer External GPU(日本語だと「外部 GPU を優先」)のチェックを入れる
    Screen Shot 2020-10-19 at 15.01.19.png

以上です。

参考

https://support.apple.com/ja-jp/HT208544

※ というか下記にかいてるのをほぼそのまま書いてます

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

UnityでiOS向けにC系の関数を扱う

概要

UnityからC言語を使う為の備忘録です。

参考

https://docs.unity3d.com/ja/2018.4/Manual/NativePlugins.html

実装

名前空間

using System.Runtime.InteropServices;

[DllImport("__Internal")] を使用するのに必要です。

属性

[DllImport("__Internal")] 

メソッドの上に書く。

サンプル

/// <summary>
/// 初期化
/// </summary>
[DllImport("__Internal")]
static extern void InitializeiOS(string hogehoge);

iOSでしか機能しないので「UNITY_IOS」などのシンボルを活用すると尚良い。

C

extern "C"
{
    void InitializeiOS(char *hoge)
    {
        // 処理
    }
}

stringはcharのポインタで。

設置方法

基本的には「Assets/Plugin/iOS/XXXXX.mm」としてファイル名をつけて保存する。
ビルドするとそのままXcodeプロジェクト内部に保存される。

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

Unity対応のマージツールを比較する

はじめに

チーム開発ではバージョン管理システム及びマージツールは必要不可欠です。
私は普段の開発ではVSCode+GitLensを使用することが多いのですが、Unity純正のバージョン管理システムであるUnity Collaborateを使って開発する機会ができたため、この機会にUnity対応のマージツールを探します。

MacだとApple File Mergeがあるので、今回はWindows対応のものを探します。

前提

要件は、Unity側で対応していること、無料であること、Windowsで使えること。
用途はUnity Collaborateでのソースコードの比較です。

(マージツールの説明についてはWikipediaを参照してください。)

比較対象

Windows版のUnityが対応している比較/マージツールは以下の7種。

  • SourceGear DiffMerge
  • TkDiff
  • Araxis Merge
  • TortoiseMerge
  • WinMerge
  • PlasticSCM Merge
  • Beyond Compare 4

その中で無料で使用できるのは

  • SourceGear DiffMerge
  • TkDiff
  • TortoiseMerge
  • WinMerge

の4つでした。
(PlasticSCM Mergeはライセンスによって値段が変わり、個人、非営利団体、及びオープンソース開発には無料で用いることができますが、今回は外します)

簡易比較

今回の結果の表です。簡易的に比較します。情報量の多さの参考としてGoogle検索結果の見積もり件数(2020/10/19現在)を載せました。

マージツール Google検索結果の見積り数 セットアップの大変さ Windows以外のOS 使用感(個人の意見)
(SourceGear) DiffMerge 約 440,000 件 簡単 対応 シンプル
TkDiff 約 77,700 件 大変 対応 (未使用)
TortoiseMerge 約 30,300 件 やや大変 非対応 使いやすい
WinMerge 約 501,000 件 簡単 非対応 まあまあよい

検証

実際使ってみます。

SourceGear DiffMerge

Mac OSやUbuntu等にも対応しています。
セットアップはホームページからダウンロードしてセットアップウィザードに従うだけなのでとても簡単です。

DiffMerge.PNG

UIは英語ですが、とてもシンプルなので問題には感じません。

機能としては

  • 変更のある行ごとに「変更前のものを適用する」
  • 「次の変更に飛ぶ」
  • 「前の変更に飛ぶ」
  • 「重要でない変更は隠す」(インデント等)

等があります。シンタックスハイライトはなさそうです。
シンプルさが好きでどのOSでも同じものが使いたいというのであればこれを使うのが良いように感じました。

TkDiff

すみません、数時間粘りましたがUnityに認識させることができませんでした。

TkDiffはTcl/Tk環境が必要です。WindowsではTcl/Tk環境がないため、環境構築から始める必要があります。

Tcl/Tk(ティクル・ティーケー)は、スクリプト言語 Tcl と、その GUIツールキット Tk を指す。(Wikipedia引用)

環境構築はActiveTclをダウンロードするか、SourceForgeからソースコードをダウンロードしてコンパイルするなどの方法があります。コンパイル方法については以下のQiitaの記事が参考になります。
Visual Studio 2017でTcl/Tk 8.6.9をコンパイルする

次にTkDiffのダウンロード。
セットアップウィザードはありません。zipファイルをダウンロードして、展開して、ファイル名に拡張子を追加して(tkdiff → tkdiff.tcl)PATHを通したところまでやったのですが、Unityが上手く認識してくれずに断念しました。
Windows以外ならばうまく動くのかもしれません。

TortoiseMerge

Windows専用。
TortoiseSVNという、バージョン管理システム(SVN)のクライアントアプリケーションに付随するソフトで、つまりTortoiseSVNをダウンロードする必要があるっぽいです。余分なものがついてくるので嫌な人は注意。また、日本語化するには追加で日本語化パックをインストールして設定をする必要があります。
これ単体ではググったとき日本語の情報が少ないです。

tortoise.PNG

変更点、追加点が分かりやすく、機能も画像をパッと見て分かる通り豊富です。
UIは4つの中で最も優れているように感じました。簡単に使えます。

WinMerge

Windows専用。日本語の情報が4つの中で最も多いように思えます。
セットアップも簡単です。

※注意:WinMergeは64bit版だとUnity側で認識されなさそうなので注意。Unityで利用する場合は32bit版をダウンロードするようにしてください。

WinMerge.PNG

UIはTortoiseMergeには劣りますが(個人の感想です)使い辛いというほどではなく、機能も豊富です。

結論(個人の意見です)

どのOSでも同じものを使いたい or シンプルイズザベスト
→SourceGear DiffMerge

UI命
→ TortoiseMerge

無難に、普通に、楽に使いたい or 日本語の情報が多いものがいい
→ WinMerge 32bit版

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