20211013のUnityに関する記事は3件です。

Unity設計入門:目次

はじめに Unityで開発している際に雑に書いてしまうと、コードが膨れ上がって混沌とすることが多いと思います。 そして、それを解決するためにネットで検索してみると「MVPやMVCなどの技法があるらしいぞ」とか「疎結合にするといいっぽい」とか、いろいろな手法の情報が得られます。 しかし、「概念だけ言われても実際どう書くんだよ!」「単純なサンプルだけじゃわかんないよ!」「とりあえず言われたライブラリを使ってみたけどよくなった気がしない」と思ってしまうこともしばしばあります。また、それぞれの記事で前提知識が多かったり、「責務の問題」とかいう曖昧な言葉でお茶を濁されたりしがちです。 そこで、このシリーズでは、マクロな設計について、「基礎の基礎から」そして「実際のコードを踏まえて」解説していきたいと思います。 対象読者 C#・Unityがなんとなく分かる人 UniRXの超基本的なところが分かる人(具体的には IObservable, IObserver, Subject, ReactiveProperty, Subscribe, OnNext程度です) Unityでもう少しいい感じのコードが書きたい人 マクロな設計についての知識を増やしたい人 ※「switch文を消したい」や、「個々のオブジェクトの生成方法」などのコードレベルのミクロな設計については対象外です リンク 第1章「ModelとView」・理論編 第1章「ModelとView」・実践編 第1章(補足)「オブジェクト指向とコンポーネント指向」(10/18投稿) 第1章(補足)「変わるものと変わらないものの分離」(10/20投稿) 第2章「MVXの思想」・理論編その1(10/22投稿) 第2章「MVXの思想」・理論編その2(10/24投稿) 第2章「MVXの思想」・実践編その1(10/26投稿) 第2章「MVXの思想」・実践編その2(10/28投稿) 第3章その1「監視型View」・理論編(10/30投稿) 第3章その1「監視型View」・実践編(11/1投稿) 第3章その2「Passive View」・理論編(11/3投稿) 第3章その2「Passive View」・実践編(11/5投稿) 第3章その3「バインディング」・理論編(11/7投稿) 第3章その3「バインディング」・実践編(11/9投稿)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

強化学習の手法に学ぶ、好奇心を持つことのメリット

結論 好奇心を持つことで目先の小さな不利益に惑わされずに、まだ見ぬ大きな利益を得る可能性を高められる 用語定義 好奇心 未知のものに対する興味のこと エージェント シュミレーションを行う主体のこと ゲームをクリアさせる課題の場合、プレイヤーが操作するキャラクターをエージェントにするのが一般的 報酬 エージェントに与えられる利益のこと マイナスもある エージェントは最終的な報酬を最大化するように行動する 根拠 好奇心が必要ないパターン ※説明用の課題にはUnity向けの強化学習ライブラリであるML-Agentsのサンプルプロジェクトを用いる 以下の課題を考える エージェントの頭に転がる玉が乗っている エージェントは頭の傾きを変更することができる なるべく長時間玉を落とさないことが目的 この課題では以下の場合に報酬を与えれば良い 玉が頭に乗っている時: 報酬+ 玉が頭から落ちた時: 報酬--- この条件で学習をすると、比較的短時間の学習をするだけでボールを中々落とさないようなエージェントが出来上がる 好奇心が必要になるパターン 上記のシンプルな手法では対応できないパターンが存在する 以下の課題を考える エージェントはフィールドを縦横に動き回れる フィールドの中央には階段で登れる塔が存在する 塔の頂上にエージェントが到達することが目的 好奇心なしの場合 この課題において以下の場合に報酬を与えて学習を行った 塔の頂上にエージェントが到達した時: 報酬+++ 定期的に微量の報酬を与える。塔の頂上とエージェントの直線距離が近いほど多くの報酬を与える しかし、一晩中学習させても塔の頂上にたどり着くことは無かった 長時間学習させた後のエージェントの挙動は塔の下辺りでひたすらウロウロしていた 塔の頂上とエージェントの直線距離が近いほど定期的に得られる報酬が多いため、目先の利益を考えるとこの行動が最適だからである。 塔に登るためには塔の周囲を探索して階段を見つける必要がある 塔の周囲を探索するという行動の原動力となるのが好奇心である 好奇心ありの場合 報酬を与えるタイミングを以下の様に変更して再度学習を行った 塔の頂上にエージェントが到達した時: 報酬+++ 定期的に微量の報酬を与える。エージェントは周囲の環境を視覚的に観測し、前回の観測結果と今回の観測結果の差分が大きいほど多くの報酬を与える 以上の条件で数時間学習を行った結果、塔の頂上に辿りつくことができるエージェントが出来上がった 考察 複数の選択肢があり、それらは選んでみないと得られる利益がわからないとする。 この時、「得られた利益の大きさ」で単純に選択肢を切り捨てていくと、短期的には得をする確率が高い。なぜなら期待値が大きい選択肢が残る可能性が高いからである。 しかし、「利益の最大値と分散が大きいもの」がある場合、先程の選び方ではこの選択肢は切り捨てられる可能性が高い。 「利益の最大値と分散が大きいもの」を見つけたいのであれば、「分散の大きさ」を考慮に入れて選択肢を選ぶ必要がある。 分散の小さい選択肢は同じ結果が出続ける可能性が高いのでひとまず保留して、分散の大きい選択肢の期待値を図ることに注力すれば様々な選択肢を探索する事ができる。 前者の方法はギャンブルで堅実に利益を出したい時などに向いている。 後者の方法は明確なゴールが決まっており、それ以外の結果は意味をなさない場合など向いていると考えられる。将棋などの勝敗が決まっている課題などに使えそう 余談 上記の好奇心ありの条件の学習時間を短縮する為に、定期的に微量のマイナス報酬を与えてみた。 するとフィールドの探索をしなくなってしまった。 これは探索によって得られる報酬よりも定期的なマイナス報酬が上回ってしまった結果、この選択が最も苦痛が少ないと判断された為である。 この挙動を人間に当てはめてみると考えさせられるものがある。 好奇心があり、今後の過ごし方次第で大きな利益を獲得できる可能性のある人が、現在の環境による苦痛によって命を経ってしまうことはこれと同じ理屈だと考えられる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity でUnitTest とML-Agents を使用する時の参照トラブル対応

Unity で単体テスト環境を構築した後、ML-Agents を使ってゲーム上のNPU をAI化しようとして嵌ったので、顛末を共有します。 概要 Unity で単体テスト環境を構築 ML-Agent をプロジェクトに追加してAgent クラスを参照しようとしたらnamespace が見つからない問題が発生 ML-Agent 内に鎮座していたAssembly Definision Filesを参照させるようにして問題解決 Unity で単体テスト環境を構築 テストコードを格納するためのディレクトリを作成する まず、Unity のProject ツリーにて、テスト環境を格納するためのディレクトリを作成します。この時、通常のディレクトリ作成手順(Create -> Folder)ではなく、Create -> Testing -> Tests Assembly Folder と選択することでテスト環境用のディレクトリを作成します。 ディレクトリが作成された際、ディレクトリの中にTests.asmdef という名前のAssembly Definition Files (以下adf)が作られています。このadf によって、Unity のTestRunner がリンクされ、単体テストを実行できるようになります。適宜本ディレクトリ内にテストコードを追加していきましょう(本稿では単体テストそのものについては省略します)。 テスト対象のディレクトリを準備する 上記の手順でadf を作成すると、テストシナリオ用のdll (以下、テストシナリオ.dll)が作られるようになります。ここで、テストシナリオ.dll と周辺のdll との関係は以下の図のようになっています。 この時点では、テスト対象のコード群は図の「その他大勢」に含まれてしまっており、テストシナリオ.dllから参照することができません。そのため、テスト対象のコード群を独立したdll として分離し(以下、テスト対象.dll)、テストシナリオ.dll から参照するように設定する必要があります。下記がそのイメージ図です。 テスト対象を分離させるには、テスト対象のソースコードを特定のディレクトリ以下に配置し、このディレクトリ直下に新たにadf を作成します。今回はテスト対象のadf ファイル名をTarget.asmdef とします。 続いて、テストシナリオ側(Tests.asmdef)からテスト対象(Target.asmdef)を参照できるように、Unity のエディタ上でTarget.asmdef をTests.asmdef のAssembly Definition References に追加します。既にTestRunner がリストに存在していると思うので、リストに追加する形になります。 ML-Agent をプロジェクトに追加 GitHub のUnity-Technologies / ml-agentsを参考にして、ML-Agents をUnity のプロジェクトに追加してください。 そして、自分のソースコードからAgent クラスを参照しようとしたらnamespace が見つからないと怒られます。。。 using UnityEngine; using UnityTetris.Abstract; using UnityTetris.Interface; using Unity.MLAgents; using Unity.MLAgents.Sensors; public class MLInput : Agent, IInputManager { 「namespace ML-Agents が見つからない」と怒られますね。。。 今回の単体テスト環境構築により、自分のソースコードがTarget.asmdef によりAssembly-Csharp.dll (いわゆるその他大勢)から分離されてしまうため、ML-Agents を参照するように明示的に設定を行う必要があります。 ML-Agents を参照するように設定する 実は、プロジェクトビューのPackages 以下にあるML Agents 内にもUnity.ML-Agents.asmdef というadf があるので、これをTarget.asmdef から参照するように設定する必要があります。Target.asmdef をInspector で表示し、この中にあるAssembly Definition References のリストにUnity.ML-Agents.asmdef を追加してください。 これにより、自分のソースコードからML-Agents を参照することができるようになります。各dll の関係は以下のようになります。 ML-Agents 以外のパッケージを使用する場合でも同様の理屈で参照設定する必要がありますので、単体テスト環境を構築した場合は注意しましょう。 参考ページ Unity Assembly Definition 完全に理解した
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む