ウチのブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PageTop

今日のブックマーク

【Unityバージョン:2017.3】
UIをゲームパッドで動かしたかった。

[Unity][uGUI] UIをゲームパッドやキーボードで操作する
http://westhillapps.blog.jp/archives/43683528.html
2017.3でも基本的には5.xと同じ。
ボタンの設定はGamepad Input向けに指定している名前にする必要があるので、Input Managerで名前を確認しつつ入力。
20180109_1.png 20180109_2.png
こんな感じに設定。

シーンを開いたときの初期ボタンはEventSystem経由で、Start()で指定したりする。
EventSystem - Unity スクリプトリファレンス
https://docs.unity3d.com/ja/540/ScriptReference/EventSystems.EventSystem.html

ゲームパッドの上下ボタンでボタンの選択がカチカチ動く。

[広告] VPS


以上

スポンサーサイト

PageTop

今日のブックマーク

【Unityバージョン:2017.3】
ボール追従カメラを作ろうと思った。

Playerに追従するカメラ - Qiita
↑素朴には目標物との相対位置を決めておいて、カメラの位置をUpdateで更新しながらその相対位置を維持させるという感じで。

ただ、Updateの周期のことを何も考えずに動かしてみたら追従するときの描画がカクつく。
追従させようとしたボールの動きを物理で動かしていたのだが。

Unityでゲームを作った際に「カクカクしている」と言われないためのTimeSettings.FixedTimestep講座
http://yaseino.hatenablog.com/entry/2016/02/23/234652
↑の記事に書かれている、描画と物理の更新タイミングあるいはUpdate(LateUpdate)とFixedUpdateの間隔の違いが原因だった。
解説にあるとおり、Project Settings > Time > Fixed 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
↑のようなものも見つける。これはこれで為になるし、実際Bounce Thresholdの値をデフォルトの2から3にすると少しはマシになった気がする...が、まだ跳ねる。

物理演算マネージャー - Unity マニュアル
https://docs.unity3d.com/ja/current/Manual/class-PhysicsManager.html
↑Bounce Thresholdの値ほかの解説。Project Settings > Physicsで開く。

跳ねない、回らない、止まらない
http://www.chosyu.jp/nohohon/archives/entry/2013/04/entry_130401_233407.php
↑こういうのも見つけた。ボールの転がりを表現するとき、Physics Materialの摩擦係数・反発係数に加えてAngular Dragの値もちゃんと指定するというのは見落としポイントだが、跳ねる件とはあんまり関係なく。

いろいろ試していて分かったのは、落ちるボールと床の両方にRigidbodyを入れてしまっていたのが原因ということ。
UnityのRigidbodyとColliderで衝突判定
https://qiita.com/yando/items/0cd2daaf1314c0674bbe
  • 落下する物体
    • 物体の形に応じたCollider
    • 重力が設定されたRigidbody
  • 受け止める地面
    • 地面の形に応じたCollider
↑を守ってなかったと。
そうなると地面を転がってるボールが不定期に跳ねるようになるってのは知らなかったが...
地面のオブジェクトからRigidbodyを削除したらボールが落ち着くようになりました。

Rigidbody - Unity マニュアル
https://docs.unity3d.com/ja/current/Manual/class-Rigidbody.html
↑UnityマニュアルのRigidbodyの記述もいろいろ書いてある。

c#のリフレクション - Qiita
https://qiita.com/dolls/items/c7b3cf2520baae158a3a
↑ボール跳ね解決の試行錯誤の間にリフレクションについて勉強。

Windows 10の新機能「動画キャプチャー」の使い方を教えて!
http://ascii.jp/elem/000/001/066/1066550/
↑Windows 10にもMacのQuickTime Player相当の機能が?と思ったけどそれほど使いやすくなかった...そもそもXboxアカウントがないと動画の再生もできないっぽい。
Windowsはまだまだ個別の動画ソフトが必要か...


以上

PageTop

今日のブックマーク

【Unityバージョン:2017.3】
気が付けば松が取れてもう連休明けから仕事始まっちゃうよ。

とりあえず前にいじってたゲームパッドの扱いに関して。
Unityデフォルトだとやっぱりゲームパッドを複数扱うようにしたときがつらい感じだったので、Gamepad Inputを入れる。

これを前に入れたInputEventHandlerでも使えるようにしたかったのだが、イベントの引数として渡すときにボタンの種類に加えてどのゲームパッドから入力されたかを区別する必要があった。
前に導入したのはDictionaryでボタンの名前をKeyCodeに紐づける方法。
いまはGamepad Inputを入れたので、ボタンは生のKeyCodeではなく、Gamepad 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。
Mono (software) - Wikipedia
https://en.wikipedia.org/wiki/Mono_(software)
(Monoのバージョンと.NETバージョンとの対応表は英語版Wikipediaには載っているが日本語版Wikiには載っていない...)

UnityにおけるMonoと.NETの違いが微妙だったので、こちらも参考にした。
Unity で生成する Windows アプリの中身とデバッグ
http://yutawatanabe.hatenablog.com/entry/unity-windows-build-and-debug

UnityのMonoやC#のバージョン - Qitta
https://qiita.com/snaka/items/0b59a56cbb803147a5d4
monoの実行ファイルを直接叩いてバージョンを確かめることもできるようだ。

Unityに搭載されているMonoのバージョンに依存してUnityで使えるC#が長らくC#4相当のそれだったのでTupleを使いたいときは自分で実装してみたり、
Tuple implementation for use with Unity3d - gist
https://gist.github.com/michaelbartnett/5652076#file-tuple-cs

あるいはUniRx.Tupleを使うという手段をとることになっていたが、Unity5.5から.NET 4.6は使えるようになっていたようで、
【Unity】.NET 4.6、C# 6対応のUnityエディタ、ベータ版が公開
http://tsubakit1.hateblo.jp/entry/2016/10/05/221135

2017.3では、Unityエディターで、Edit > Project Settings > Playerから、各プラットフォームのOther SettingsのConfigurationから使う.NETのバージョンを変えられる。
C#6.0時代のUnity - Qiita
https://qiita.com/divideby_zero/items/71a38acdbaa55e88e2d9
無題2 

これでIndexと{Button|Axis|Trigger}を組にしたTupleをGamePadクラスに突っ込んでおき、イベントに渡すようにした。

Enumを数値に、あるいはその逆、またあるいはあるEnumの中にある名前を取ってくる方法の確認。
Enumメモ - Qiita
https://qiita.com/motohacy/items/096b273707eabef5c2b1
Enum.GetValuesという便利なのがある。

KeyCodeからTupleを引数に取るようにゲームパッドの入力イベントハンドラをいじるとき、delegate周りをいろいろいじることになったので、もう一度delegateとは、FuncとかActionとはってとこも確認。
デリゲートとは【C#】
http://kan-kikuchi.hatenablog.com/entry/Delegate

Unityでゲームオブジェクトやコンポーネントのメソッドを呼び出す方法色々

これでようやく1コンと2コンがわかりやすく分かれた状態ができた。

次に2コンを自動制御にして、イベントを発火させて1人用の基礎を作る。
となるとタイマーが必要。
Unityでタイマーを使う - Qiita
https://qiita.com/yuta_iw/items/b06b2f1a2608da3ab36a

とりあえず写経して、タイマーをボールを打ち出す装備を持たせたキャラで、COM持ちの制御にしたところに入れ込む。

3秒に一度勝手にボールを打ち出す何かしらができた。


以上。

PageTop

新年のブックマーク

【Unityバージョン:2017.3】
あけましておめでとうございます。
帰省しつつも相変わらずコントローラーの制御の件。

最初にQiitaから拾ってきたInputManager隠蔽するやつを使ってからずいぶん迷走しております。
UnityのProject Settings > Inputにキーの名前とKeyCodeを指定して、さあそれをどうやって使うか?
という段になって、キーの名前の定義をKeyCodeに変換する方法をいくらか調べてた。

Input Manager (From string to keycode)
Enum.Parseを使うとInputManagerに入れている文字列をKeyCodeにできる...みたいなことが書いてあるが。

InputManager向けボタン名とKeyCodeの相互変換
↑で上げられているものしか引っかからない?
たとえばジョイスティック0のボタン0をEnum.Parseで引きたいときは
Enum.Parse(typeof(KeyCode), "Joystick2Button0");
のように打たないと実行時にEnumの値が見つからないというエラーになってしまった。
でもこれではあんまり美味しくなくて、本当はプレイヤー0用のアクションボタンにしたいボタンに対して"Player0 Action"のように名前をInputManagerで指定して、
Enum.Parse(typeof(KeyCode), "Player0 Action");
と引いたら対応するKeyCodeを返してほしい。

PlayerPrefs - Unity スクリプトリファレンス

PlayerPrefs.GetString

PlayerPrefsにキーの設定を入れて読み出す、が王道なのだろうか。うーむ

How to Create a Custom Input Manager in Unity C#
こういうのもあるのか...ううむ。


以上

PageTop

今日のブックマーク

【Unityバージョン:2017.3】
プレイヤーを2人置いて、片方を自分が動かしてもう片方をコンピュータに動かさせたい。
入力管理はこの前のInputManagerでそれぞれのボタン入力をイベントとして扱う。

  • プレイヤーを区別するフィールドを入れる
  • 2人でコントローラーを使って動かす仕組みを入れる
  • そのうちの2人目の制御をコンピュータに動かさせる
基本的にはこんな方針で。

そのため、InputManagerに定義されている入力を2人分作る必要があるのでは?
と思ってEdit > Project Settings > Inputをちくちくいじり始めたが、いかにも面倒。

Unityでゲームパットを複数挿してプレイしよう
http://tsubakit1.hateblo.jp/entry/2014080421292125
Gamepad Inputというアセットの紹介。
これやってみていまだにUnityの複数ゲームパッドを扱う機能イケてないは感じたが、Gamepad InputはこれはこれでUnity 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を自分で実装してコンフィグするよりこちらが正統なアプローチなのかもしれない。

[Unity] InputManagerの設定情報をスクリプトから参照する
http://ftvoid.com/blog/post/858
こっちは設定を確認する方法。

[Unity3D]Instantiate と Awake とか 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に置いておけばいいっぽい。


以上

PageTop
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。