ウチのブログウチのブログプロフィールAuthor:ぺで3年ぶりに浮上。その間お外に出て働いたりいろいろありました。(1)RSSフィード最新記事のRSS最新コメントのRSS最新トラックバックのRSS今日のブックマーク2018年01月09日(Tue)Unity【Unityバージョン:2017.3】UIをゲームパッドで動かしたかった。UIをゲームパッドやキーボードで操作するhttp://westhillapps.blog.jp/archives/43683528.html2017.3でも基本的には5.xと同じ。Managerで名前を確認しつつ入力。シーンを開いたときの初期ボタンはEventSystem経由で、Start()で指定したりする。スクリプトリファレンスhttps://docs.unity3d.com/ja/540/ScriptReference/EventSystems.EventSystem.htmlゲームパッドの上下ボタンでボタンの選択がカチカチ動く。VPS以上Tweetスポンサーサイト00今日のブックマーク2018年01月08日(Mon)Unity【Unityバージョン:2017.3】ボール追従カメラを作ろうと思った。Qiitahttps://qiita.com/valbeat/items/bab5cb649fe0cf6756d4↑素朴には目標物との相対位置を決めておいて、カメラの位置をUpdateで更新しながらその相対位置を維持させるという感じで。Updateの周期のことを何も考えずに動かしてみたら追従するときの描画がカクつく。追従させようとしたボールの動きを物理で動かしていたのだが。Unityでゲームを作った際に「カクカクしている」と言われないためのTimeSettings.FixedTimestep講座http://yaseino.hatenablog.com/entry/2016/02/23/234652↑の記事に書かれている、描画と物理の更新タイミングあるいはUpdate(LateUpdate)とFixedUpdateの間隔の違いが原因だった。Timestepの数値をデフォルトの0.02から0.0166(=約60fps)に変えたら劇的に改善した。0.0166は正確に1/60ではないから追従しきれない部分も残るが...ビルドするシーンを自動で設定【Unity】【エディタ拡張】http://kan-kikuchi.hatenablog.com/entry/ScenesInBuildUpdaterついでにビルドするシーンを自動で設定するスクリプトも乗せてみた。エディターで実行している間は普通に再生できてしまうので気にならないが、スクリプトからシーン遷移しようとするとエラーになるのでこのようにビルド対象を一括で指定できる仕組みは便利。カメラ追従もできてきたところでボールを地面に転がしたときに奇妙な現象が発生。なんか地面に転がしたボールがたまに跳ねる。バッタみたいな感じで...タイマーを入れて自動でボールにAddForceするところがあるので、もしかしてそれが変に作用してる?と思ったがそうでもなく...Unityで跳ね返りの挙動がおかしい時の確認事項http://macomu.sakura.ne.jp/blog/?p=77↑のようなものも見つける。Thresholdの値をデフォルトの2から3にすると少しはマシになった気がする...が、まだ跳ねる。Thresholdの値ほかの解説。Physicsで開く。跳ねない、回らない、止まらないhttp://www.chosyu.jp/nohohon/archives/entry/2013/04/entry_130401_233407.php↑こういうのも見つけた。Dragの値もちゃんと指定するというのは見落としポイントだが、跳ねる件とはあんまり関係なく。試していて分かったのは、落ちるボールと床の両方にRigidbodyを入れてしまっていたのが原因ということ。地面の形に応じたCollider↑を守ってなかったと。なると地面を転がってるボールが不定期に跳ねるようになるってのは知らなかったが...地面のオブジェクトからRigidbodyを削除したらボールが落ち着くようになりました。マニュアルhttps://docs.unity3d.com/ja/current/Manual/class-Rigidbody.html↑UnityマニュアルのRigidbodyの記述もいろいろ書いてある。Qiitahttps://qiita.com/dolls/items/c7b3cf2520baae158a3a↑ボール跳ね解決の試行錯誤の間にリフレクションについて勉強。Player相当の機能が?と思ったけどそれほど使いやすくなかった...そもそもXboxアカウントがないと動画の再生もできないっぽい。気が付けば松が取れてもう連休明けから仕事始まっちゃうよ。前にいじってたゲームパッドの扱いに関して。これを前に入れたInputEventHandlerでも使えるようにしたかったのだが、イベントの引数として渡すときにボタンの種類に加えてどのゲームパッドから入力されたかを区別する必要があった。前に導入したのはDictionaryでボタンの名前をKeyCodeに紐づける方法。Inputで独自実装されているGamepadInput.GamePad.{Button|Axis|Trigger}というenumに定義された名前で飛んでくる。ボタン0を押すとGamepadInput.GamePad.Button.Aが押されたという具合で入力を取得できる。ゲームパッドの番号はGamepadInput.GamePad.Indexと分けて管理されているため、KeyCodeならKeyCode.Joystick1Button0などとリニアに並んだKeyCodeを打てばゲームパッド1番のボタン0などと取れたところが取れなくなっている。...というところでIndexと{Button|Axis|Trigger}を組にしてイベントの引数として渡す必要が生じ、したがってTupleが必要になった。ところでUnityでC#、といえば出てくるのがMono。Wikipediahttps://en.wikipedia.org/wiki/Mono_(software)(Monoのバージョンと.NETバージョンとの対応表は英語版Wikipediaには載っているが日本語版Wikiには載っていない...)UnityにおけるMonoと.NETの違いが微妙だったので、こちらも参考にした。Qittahttps://qiita.com/snaka/items/0b59a56cbb803147a5d4monoの実行ファイルを直接叩いてバージョンを確かめることもできるようだ。SettingsのConfigurationから使う.NETのバージョンを変えられる。Qiitahttps://qiita.com/divideby_zero/items/71a38acdbaa55e88e2d9これでIndexと{Button|Axis|Trigger}を組にしたTupleをGamePadクラスに突っ込んでおき、イベントに渡すようにした。Enumを数値に、あるいはその逆、またあるいはあるEnumの中にある名前を取ってくる方法の確認。Qiitahttps://qiita.com/motohacy/items/096b273707eabef5c2b1Enum.GetValuesという便利なのがある。KeyCodeからTupleを引数に取るようにゲームパッドの入力イベントハンドラをいじるとき、delegate周りをいろいろいじることになったので、もう一度delegateとは、FuncとかActionとはってとこも確認。デリゲートとは【C#】http://kan-kikuchi.hatenablog.com/entry/DelegateUnityでゲームオブジェクトやコンポーネントのメソッドを呼び出す方法色々http://12px.com/blog/2015/08/unityevent/これでようやく1コンと2コンがわかりやすく分かれた状態ができた。次に2コンを自動制御にして、イベントを発火させて1人用の基礎を作る。なるとタイマーが必要。Qiitahttps://qiita.com/yuta_iw/items/b06b2f1a2608da3ab36aとりあえず写経して、タイマーをボールを打ち出す装備を持たせたキャラで、COM持ちの制御にしたところに入れ込む。3秒に一度勝手にボールを打ち出す何かしらができた。Tweet00新年のブックマーク2018年01月01日(Mon)Unity【Unityバージョン:2017.3】あけましておめでとうございます。帰省しつつも相変わらずコントローラーの制御の件。最初にQiitaから拾ってきたInputManager隠蔽するやつを使ってからずいぶん迷走しております。Inputにキーの名前とKeyCodeを指定して、さあそれをどうやって使うか?という段になって、キーの名前の定義をKeyCodeに変換する方法をいくらか調べてた。keycode)https://answers.unity.com/questions/59366/input-manager-from-string-to-keycode.htmlEnum.Parseを使うとInputManagerに入れている文字列をKeyCodeにできる...みたいなことが書いてあるが。"Joystick2Button0");のように打たないと実行時にEnumの値が見つからないというエラーになってしまった。Action");と引いたら対応するKeyCodeを返してほしい。スクリプトリファレンスhttps://docs.unity3d.com/jp/540/ScriptReference/PlayerPrefs.htmlPlayerPrefs.GetStringhttps://docs.unity3d.com/jp/540/ScriptReference/PlayerPrefs.GetString.htmlPlayerPrefsにキーの設定を入れて読み出す、が王道なのだろうか。C#http://www.studica.com/blog/custom-input-manager-unity-tutorialこういうのもあるのか...ううむ。以上Tweet00今日のブックマーク2017年12月30日(Sat)Unity【Unityバージョン:2017.3】プレイヤーを2人置いて、片方を自分が動かしてもう片方をコンピュータに動かさせたい。入力管理はこの前のInputManagerでそれぞれのボタン入力をイベントとして扱う。プレイヤーを区別するフィールドを入れる2人でコントローラーを使って動かす仕組みを入れるそのうちの2人目の制御をコンピュータに動かさせる基本的にはこんな方針で。Inputをちくちくいじり始めたが、いかにも面倒。Inputというアセットの紹介。3.xベースの時代の産物で、2017.xの環境に持っていくまでがだいぶ面倒かも...今回は使わず。Unityでゲームパッドから複数入力を受け取る方法まとめhttp://inaenomaki.hatenablog.com/entry/2016/12/16/184639#%E3%82%AD%E3%83%BC%E3%82%B3%E3%83%B3%E3%83%95%E3%82%A3%E3%82%B0%E3%81%8C%E4%BD%BF%E3%81%88%E3%82%8BこっちはUnity標準のInputManagerについて初歩から解説してくれてる。「仮想入力」の概念とそれを使うメリットなど。【Unity】スクリプトからInputManagerを自動生産するhttp://wordpress.notargs.com/blog/blog/2015/01/23/92/こちらはUnityプロジェクトで生成されるProjectSettings/InputManager.assetの中身をエディター拡張で直接いじっていくやり方。こちらの記事にあるエディター拡張は2017.3でも動いた。UnityエディターがそもそもScriptableObjectでできているという説からすると先日のInputManagerを自分で実装してコンフィグするよりこちらが正統なアプローチなのかもしれない。InputManagerの設定情報をスクリプトから参照するhttp://ftvoid.com/blog/post/858こっちは設定を確認する方法。Startが流れるタイミングを把握するhttp://jigax.jp/unity-%E3%81%AE-instantiate-%E3%81%A8-awake-%E3%81%A8%E3%81%8B-start%E3%81%8C%E6%B5%81%E3%82%8C%E3%82%8B%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%92%E6%8A%8A%E6%8F%A1%E3%81%99%E3%82%8B/これはプレイヤーに装備させるもの(棒とか)をプレイヤーのパーツ(手とか)にセットしたとき、装備させたものに従ってプレイヤーのパーツのふるまいを変えるという仕組みを実装しようとして、そのとき「装備させるもの」側をプレハブ化して扱うために、そのプレハブができたときにMonoBehaviourのどのタイミングで入力イベントのアタッチなどをやればいいのか?という問題にあたったので調べた。生成時ならAwakeに置いておけばいいっぽい。