20220110のUnityに関する記事は8件です。

DictationRecognizerを使ってみる

この記事について Unityの標準で用意されているDictationRecognizerを利用してみます。 動作環境 Windows10(Windows10でしか動かないそうです) 注意:設定 > プライバシー > 音声認識がオンになっていないと動きません。 Unity 2021.3.24f1 やりたいこと 今回やりたいことはゲーム内で音声を受け取ってその結果を取得してゲームに反映させるということを使用と思います。 例:メニューと発言するとUIが表示される DictationRecognizer DictationRecognizerはフレーズを受け取った際にその内容を返す音声認識ライブラリです。 認識するキーワードを用意するわけではないので、歪みのある表記は苦手だと思います。(一と書いて「いち」と読ませるか「はじめ」と読ませるかなど) 帰ってくる値は「仮説(Hypotheses)」と「認識(Recognition)」の2種類の文字列があります。 HypothesesとRecognition Hypothesesは認識が甘めの文字列で、発言の途中であっても文字列を返します。 Recognitionは発言終了後に精度が高い文字列を返します。 個人的にはKeywordRecognizerとDictationRecognizerの中間的なライブラリが欲しい...... 使ってみた とりあえずドラグスレイブを打ちたくなるのは世代の性。 上のテキストがHypothesesです。 文章のとぎれとぎれで値が帰ってきているのがわかります。 下のテキストがDictationRecognizerです。 自分が読み終わった後に1秒程度間があって表示されました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity】EventTrigger のイベント登録を簡潔に書ける拡張メソッド

お知らせ 本記事の上位互換スクリプトを作りました。 概要 EventTrigger へのイベント登録は下記のように行いますが、単純な Action より面倒です。 EventTrigger.Entry entry = new EventTrigger.Entry(); entry.eventID = EventTriggerType.PointerClick; entry.callback.AddListener(_ => Debug.Log("Clicked")); buttonTrigger.triggers.Add(entry); そこで、上のコードを下のように書ける拡張メソッドを作りました。EventTriggerType を網羅しています。 buttonTrigger.AddPointerClickListener(_ => Debug.Log("Clicked!")); コード EventTriggerExtension.cs using System; using UnityEngine.EventSystems; public static class EventTriggerExtension { public static EventTrigger.Entry AddListener(this EventTrigger trigger, EventTriggerType type, Action<BaseEventData> action) { EventTrigger.Entry entry = new EventTrigger.Entry(); entry.eventID = type; entry.callback.AddListener((eventData) => action.Invoke(eventData)); trigger.triggers.Add(entry); return entry; } public static EventTrigger.Entry AddPointerListener(this EventTrigger trigger, EventTriggerType type, Action<PointerEventData> action) { EventTrigger.Entry entry = new EventTrigger.Entry(); entry.eventID = type; entry.callback.AddListener(eventData => action?.Invoke(eventData as PointerEventData)); trigger.triggers.Add(entry); return entry; } public static EventTrigger.Entry AddAxisListener(this EventTrigger trigger, EventTriggerType type, Action<AxisEventData> action) { EventTrigger.Entry entry = new EventTrigger.Entry(); entry.eventID = type; entry.callback.AddListener(eventData => action?.Invoke(eventData as AxisEventData)); trigger.triggers.Add(entry); return entry; } public static EventTrigger.Entry AddListener<T>( this EventTrigger trigger, EventTriggerType type, Action<T> action) where T : BaseEventData { EventTrigger.Entry entry = new EventTrigger.Entry(); entry.eventID = type; entry.callback.AddListener(eventData => action?.Invoke(eventData as T)); trigger.triggers.Add(entry); return entry; } public static bool RemoveListener(this EventTrigger trigger, EventTrigger.Entry entry) { if (trigger.triggers.Contains(entry)) { trigger.triggers.Remove(entry); return true; } return false; } #region PointerEventData public static EventTrigger.Entry AddPointerClickListener(this EventTrigger trigger, Action<PointerEventData> action) => AddPointerListener(trigger, EventTriggerType.PointerClick, action); public static EventTrigger.Entry AddPointerDownListener(this EventTrigger trigger, Action<PointerEventData> action) => AddPointerListener(trigger, EventTriggerType.PointerDown, action); public static EventTrigger.Entry AddPointerUpListener(this EventTrigger trigger, Action<PointerEventData> action) => AddPointerListener(trigger, EventTriggerType.PointerUp, action); public static EventTrigger.Entry AddPointerEnterListener(this EventTrigger trigger, Action<PointerEventData> action) => AddPointerListener(trigger, EventTriggerType.PointerEnter, action); public static EventTrigger.Entry AddPointerExitListener(this EventTrigger trigger, Action<PointerEventData> action) => AddPointerListener(trigger, EventTriggerType.PointerExit, action); public static EventTrigger.Entry AddBeginDragListener(this EventTrigger trigger, Action<PointerEventData> action) => AddPointerListener(trigger, EventTriggerType.BeginDrag, action); public static EventTrigger.Entry AddDragListener(this EventTrigger trigger, Action<PointerEventData> action) => AddPointerListener(trigger, EventTriggerType.Drag, action); public static EventTrigger.Entry AddEndDragListener(this EventTrigger trigger, Action<PointerEventData> action) => AddPointerListener(trigger, EventTriggerType.EndDrag, action); public static EventTrigger.Entry AddDropListener(this EventTrigger trigger, Action<PointerEventData> action) => AddPointerListener(trigger, EventTriggerType.Drop, action); public static EventTrigger.Entry AddScrollListener(this EventTrigger trigger, Action<PointerEventData> action) => AddPointerListener(trigger, EventTriggerType.Scroll, action); public static EventTrigger.Entry AddInitializePotentialDragListener(this EventTrigger trigger, Action<PointerEventData> action) => AddPointerListener(trigger, EventTriggerType.InitializePotentialDrag, action); #endregion #region BaseEventData public static EventTrigger.Entry AddUpdateSelectedListener(this EventTrigger trigger, Action<BaseEventData> action) => AddListener(trigger, EventTriggerType.UpdateSelected, action); public static EventTrigger.Entry AddSelectListener(this EventTrigger trigger, Action<BaseEventData> action) => AddListener(trigger, EventTriggerType.Select, action); public static EventTrigger.Entry AddDeselectListener(this EventTrigger trigger, Action<BaseEventData> action) => AddListener(trigger, EventTriggerType.Deselect, action); public static EventTrigger.Entry AddSubmitListener(this EventTrigger trigger, Action<BaseEventData> action) => AddListener(trigger, EventTriggerType.Submit, action); public static EventTrigger.Entry AddCancelListener(this EventTrigger trigger, Action<BaseEventData> action) => AddListener(trigger, EventTriggerType.Cancel, action); #endregion #region AxisEventData public static EventTrigger.Entry AddMoveListener(this EventTrigger trigger, Action<AxisEventData> action) => AddAxisListener(trigger, EventTriggerType.Move, action); #endregion }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UnityのKeywordRecognizerを使ってみる

この記事について Unityの標準で用意されているKeywordRecognizerを利用してみます。 環境 Windows10(Windows10でしか動かないそうです) Unity 2021.3.24f1 やりたいこと 今回やりたいことはゲーム内で音声を受け取ってその結果を取得してゲームに反映させるということを使用と思います。 例:メニューと発言するとUIが表示される KeywordRecognizer KeywordRecognizerはUnityが標準で用意している音声認識ライブラリです。 このKeywordRecognizerは登録されているキーワードの中から発言内容と最も近しい内容のものを出力するというものになっています。 簡単実装 まずは簡単に実装してみましょう。 SimpleKeywordRecognizer.cs public class SimpleKeywordRecognizer:MonoBehaviour { [SerializeField]private string[] keywords; private KeywordRecognizer _recognizer; void Awake() { _recognizer = new KeywordRecognizer(keywords); } private void OnEnable() { _recognizer.OnPhraseRecognized += OnPhraseRecognized; _recognizer.Start(); } private void OnDisable() { _recognizer.OnPhraseRecognized -= OnPhraseRecognized; _recognizer.Stop(); } private void OnPhraseRecognized(PhraseRecognizedEventArgs args) { Debug.Log(args.text + $", LEVEL:{args.confidence}"); } } 出力内容 音声の入力があったと判定されると「OnPhraseRecognized」が発火します。 引数として「PhraseRecognizedEventArgs」が指定されておりますが、こちらには認識された音声内容が入っています。 値 説明 text 認識された音声の文字列データ。(typeSystem.String) confidence 認識精度。High/Middle/Lowのいずれかの値が入ります。(typeUnityEngine.Windows.Speech.ConfidenceLevel) phraseDuration 音声の長さ。(typeSystem.TimeSpan) phraseStartTime 音声開始日時。(typeSystem.DateTime) semanticMeanings 認識されたフレーズの語義的な意味(よく分からない)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ゲームの完成:すいのゲームを作ろう(第6回)

ゲームの完成 タイトル画面を作ってゲームを完成させました。どうでしょうか企画書と比べてイメージ通りのゲームができたと思いませんか? ? ボーンアニメーションを利用した、くだものが走っていく姿は意外と面白いです。丸太を吹き飛ばす際の爽快感も実装することができました。今回は3種類のくだものの実装でしたが、さまざまなものの名前を学ぶことに応用ができると思います。 こんな単純なゲームでもすべて自分で作ろうと思うと大変です。木や花などはアセットを利用しています。使えるものは使っていきましょう。 ゲーム作りは簡単ではないです。様々なスキルを必要とします。はじめはとにかく簡単なゲームを作り、遊べるまで完成させてから、面白い要素を足していきます。自分が納得いくまで足したところで完成できるようにするのです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityで子要素をすべてListに入れる

public List<GameObject> _Objects; void Start() { //子要素がある時のみ if (GetChild(gameObject.transform)) {Debug.Log("取れたよ");} } bool GetChild(Transform _transform) { if (_transform.childCount <= 0){return false;} for (int i = 0; i < _transform.childCount; i++) { _Objects.Add(_transform.GetChild(i).gameObject); GetChild(_transform.GetChild(i)); } return true; }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UIとゲームバランス:すいのゲームを作ろう(第5回)

UIについて 実装したゲーム画面です。企画時、上空にある文字はなかったですが、テストプレイで流れてくる文字を読み取るのが難しいことに気が付きました。そのため、次に出てくる文字を上空に表示するようにしました。テストプレイは大切で個人でゲームを開発するには何度も自分でテストプレイを行い、楽しいと思う要素を追加していくやり方がおすすめです。 またUIについては、森やくだものということで、丸太をモチーフにしたものにしました。 ゲームを作るとUIの難しさに気が付きます。一般的に市販されていゲームのUIは開発者ではない人は気にも止めないことも多いですが、この気にならないを作り出すことに技術が必要です。今回はシンプルなゲームなので簡単に作られていますが、それでもメインの果物の邪魔にならない彩度を調整しています。少しボタンの彩度を下げています。またボタンらしく作ることで、これは押せるのだと認識させています。 #ゲームバランスについて ゲームは人の感情をより大きく動かすことが大切です。そのために難易度に波があると面白く感じます。 これは果物の速度変化を表した曲線です。始めは一定に速度がありますが、途中で変わらなくなります。ここでプレイヤーはゲームに慣れることができます。そのあとまた速度は上昇し、その後また、変わらなくなります。体験してみるとわかりますが、難易度に波を作ることでゲームが面白くなります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ゲームを作る:すいのゲームを作ろう(第4回)

ゲームの実装方法を考える 新しい技術を覚えていくのも大切ですが、自分ができることの中で実装していくことをお勧めします。学びと実装を同時に行うと完成まで時間が掛かり、モチベーションが下がりやすくます。完成までたどりつけない確率も多くなります。 出来ると思っていたことでも完成までには何かしらトラブルは起きるものです。思うように動かないときは調べる必要があり。自分ができると思っていたことでも時間が掛かるものです。なおさら自分のできる範囲で実装方法を考えるべきだと思っています。 スキルを身に着けたいときは別でプロジェクトを立ち上げ、そこで学習した方がいいです。ソースや素材の管理がシンプルになることで学ぶことに集中できます。 さて、今回は果物が走っているシーンを作ろうと思います。実際に走らせることもできますが、私は背景を動かして、果物が走っているとみせかける方法を採ろうと思います。こちらの方が背景を動かすだけなので実装が簡単です。 衝突する紐については、実装するのが難しそうだったので、まるたを吹き飛ばす仕様に変更しようと思います。内容としては2本の丸太を並べて、果物が接触した時に、各丸太がそれぞれ別の方向に飛んでいくことにします。それで、果物が丸太を吹き飛ばすという表現にします。 オブジェクトの配置 私の基本的なHierarchyはこのようになっています。特徴的なのがGameDirectorを作ることです。ここにScriptは集約しています。 またゲームで使用する定数についてはResourcesのなかにScriptableObjectを作成し一括で管理してます。使用するクラスごとに分けることでわかりやすくしています。レベルデザインの際はこの定数を変更することでプレイしながら調整できるようにしています。 クラスの構成 namespace Assets.Myscripts.BaseUtil { public abstract class BaseMono : MonoBehaviour, I_BaseMono { public abstract void CycleDisp(); public abstract void CycleSt(); public abstract void Init(); } } 私のクラスはこの独自で作ったBaseMonoをもとにスクリプトを作成しています。ゲームは様々な状態が連携して大きなシステムを作っています。そのために必ず利用するものを基底クラスとしています。 Initは初期化時に一回のみ実行。CycleStは状態を変化させる条件のみを書きます。CycleDispは状態をもとに実行する処理を書いていきます。 public override void Init() { fieldCtrl = gameObject.GetComponent<FieldCtrl>(); fieldCtrl.Init(); fruitsButtonCtrl = gameObject.GetComponent<FruitsButtonCtrl>(); fruitsButtonCtrl.Init(); } public override void CycleSt() { fieldCtrl.CycleSt(); fruitsButtonCtrl.CycleSt(); } public override void CycleDisp() { fieldCtrl.CycleDisp(); fruitsButtonCtrl.CycleDisp(); } これをGameDirectorのクラスが実行することでシステムを構成しています。状態遷移と実行を別にするのを厳守しています。また遷移条件と実行をクラス内でまとめることでクラスの独立性を保っています。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityで自動運転の車をバックさせる

概要 Unityで車のゲームを作成しています。 Unity Standard Aseetsのカーオブジェクトで,自動運転ができる,CarWayPointBasedを使用しています。 しかし,下のgifファイルの赤い車のように,前から壁などにぶつかると,そのまま進もうとして,動けなってしまいました。 バック CarAIControl.csのFixedUpdate関数ないにある m_CarController.Move(steer, accel, accel, 0f); を m_CarController.Move(-steer, -accel, -accel, 0f); に変更することで,CarWayPointBasedのカーオブジェクトをバックさせることができました。 タグ付け コースのガードレールの役割として,Cubeオブジェクトを使用していますが,このタグをwallに変更します。 大まかな流れ 今回は,CarWayPointBasedのカーオブジェクトがぶつかったオブジェクトのタグの名前がwallだった場合,カーオブジェクトをバックさせる形とします。 プログラム CarAIControl.csのクラス上で,二つの変数を宣言します。。 wallタグに変更したCubeオブジェクトに,ぶつかった時に,trueに変更するwall_touch変数と, ぶつかったあと,何秒かバックするため,Stopwatchクラスからtime変数を宣言します。 bool wall_touch = false; Stopwatch time = new Stopwatch(); CarAIControl.cs内に既にあるOnCollisionStay関数に,ソースコードを付け足します。 ぶつかったオブジェクトの名前がwallだった場合,wall_touchの値をfalseからtrueに変更し, time変数の計測をスタートします。 if (col.gameObject.tag == "wall") { wall_touch = true; time.Start(); } そして,FixedUpdate関数で,wall_touchの値がtrueだった場合,バックをおこない,3秒たったら,wall_touchの値をfalseに戻し,time変数を初期化し,普通の自動運転に戻る(elseの部分が実行される)仕様にしました。 if (wall_touch) { m_CarController.Move(-steer, -accel, -accel, 0f); if (time.Elapsed > TimeSpan.FromSeconds(3)) { time.Stop(); wall_touch = false; time = new Stopwatch(); } //Debug.Log(time.Elapsed); //Debug.Log(wall_touch); } else { m_CarController.Move(steer, accel, accel, 0f); } テスト 実際に,自動運転している赤い車を壁にぶつけてました。 バックした後,普通に走りだしたので,やりたかったことはできたと思います。 参考にさせていただいたWebサイト 特定の時間ループを実行する方法 https://www.webdevqa.jp.net/ja/c%23/%E7%89%B9%E5%AE%9A%E3%81%AE%E6%99%82%E9%96%93%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/973216817/ Unity Documentation スクリプトリファレンス Collider.OnCollisionStay(Collision) https://docs.unity3d.com/ja/current/ScriptReference/Collider.OnCollisionStay.html
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む