2016年11月15日火曜日
2016年11月14日月曜日
Final IKについて(その15)
■Interaction System Part 4
- 今回扱うInteraction Triggerは、オブジェクトに対して特定の位置でかつ特定の向きを向いているか判定するためのもの
- 大きめの球体オブジェクトを用意する
- Interaction Triggerコンポーネントをアタッチ
- Rangeに要素を追加
- このときシーンビューに可視化するかチェックボックスが現れるので有効にする
- Cahactor PositionのUseを有効にする
- Radiusを1
- 最大角度を40くらいに
- 掴みたい球体の子オブジェクトにする
- ローカル座標は0に
- 6:40付近で予告なしに、Interaction TriggerのInteractionに設定を加えている
- ボールのInteractionObjectを指定し、Effectorに右手を指定
- キャラクターにカプセルコライダーとrigidbodyをアタッチ
- Rigid BodyはisKinematicを有効にしておく
スクリプト作成
- IsInInteractionが引数必要になっており、エラーが出る
- inInteractionで代用した
- 結局、該当部は不要なので消すことになる
- キャラクターが指定角度の時でかつ、指定範囲内にいることを判定できる
- 緑の半透明な球体がInteraction Triggerのコライダー
- 紫の範囲はこのコライダー内にある必要がある
- orbitを有効にする
- Fix Y Axisを有効にすると、Interaction Triggerを持ったオブジェクトが回転しても、仰角俯角は変化しなくなる
解説通りに進めて、Eボタンを押しても反応しない- 6:40付近の設定が抜けているため
VRデモ
- あとはこのデモを見ながらさらっとした解説になる
- Camera PositionのLook at Targetにオブジェクトを指定すると、それがカメラが範囲内にあるか判定できる(FPSやVRで使う)
- ボタンはキャラの向きと、カメラの位置で判定するのが一般的とのこと
- ボタンのInteraction SystemのTriggeringにも指定必要(?)
Final IKについて(その14)
■Interaction System Part 3
- キャラクターを複製
- ボタンの位置に合わせて手の形を作る
- 成形した手をシリンダーの子オブジェクトにし、複製したキャラクターを削除する
- 子オブジェクトにした手にInteraction Targetをアタッチ
- Effector Typeを右手にする
- シリンダーの一番の親にInteraction Objectをアタッチ
- Weight Curveを追加し、山なりにする
- Multipliersに要素を追加し、Multiplierを1、ResultをRotate Bone Weightにする
- 同様にもう一つ追加し、ResultをPoser Weightにする
- Eventを追加し、0.5秒の時Poseするようにする
- キャラクターの右手にHand Poserをアタッチ
- Interaction System Test GUIをキャラクターにアタッチし、Effectorを右手にする
- シリンダーにAnimatorを追加する
- ボタンの動きを作成する
- Animatorに空のアニメーションステートと、ボタンの動きのアニメーションステートを追加する(ボタンのステートにはInteraction Objectの機能で移動できる)
- Interaction Objectに戻り、EventのAnimationに要素を追加
- Animatorは先程作ったもの
- Animation Stateに対応する名前を記入
- Reset Normalized Timeを有効にする
Final IKについて(その13)
■Interaction System Part 2
*part1の続き- Interaction ObjectコンポーネントのEvents>Messageに要素を追加し、Fanction名をOnPickUpとする
- GameObjectにはボール自身を選択する
- スクリプトを作成し、ボールを持った時の位置にオフセットを加えられるようにする(スクリプトは動画参照)
- キャラクターの向きが変わったとき、ボールもその向きに追従するようにする
- Vector3にQuaternionを足しているとしか思えない処理をする。
- Vector3で作ったholdOffsetを、OffsetPoseに変え、LateUpdate内に書いたholdOffsetを使用した箇所はコメントアウトする
- OffsetPoseをアタッチし、EffectorをleftHandにする
- Pinは足元を原点として、ホールドするローカル座標を決めるもの
- RigidBodyとShpiaColliderをボールに追加
- RigidBodyのisKinematicは有効にしておく
2016年11月13日日曜日
Final IKについて(その10)
■Aim IK Redirecting Animation
- Aim IKをアタッチ(動画のinspector古い)
- Clamp Weight、Clamp Smoothing、Tolerance(許容誤差)を0
- Use Rotation Limitsのチェックを外す
- ボーンを追加し、背骨(Spine)と首(Neck)を指定する
- Last Spine Bone に子オブジェクトを追加する
- ここでは首に子オブジェクトを追加するらしい
- 座標はすべて0
- これをAim IK のAim Transformに指定する
- 動画中触れられないが、AxisはAim Transformの向きに合わせる(第3回のチュートリアル参照)
スクリプトの作成
- 名前空間にusing RootMotion.FinalIK;
- このころのinspectorにTargetの項目がないから、処理を自作している
- aimIK.solver.IKPosition = target.position + offset;とすることで、スクリプトでAim先を調整できるようにする
- これを応用することで、Aim先にレイを飛ばし障害物を考慮したアニメーションが可能になる
- 完成品のスクリプトは動画の説明文にあり、動画内では解説しない
Final IKについて(その7〜9、10)
■Custom IK Rigs
CCDコンポーネントを使うことで、多脚の脚や戦車の砲台などもIKでコントロールすることができる。
■Full Body Biped IK Troubleshooting
後半は最初の回と似たような内容だった
■UMA Integration
スクリプトでFBBIKをaddComponetするときの注意点
■Interaction System Basics
第4回とほぼ同じ
■Combining IK Solvers (Aim + FBBIK + LookAt)
おさらい&内容が古いので割愛
■Interaction System Part 2
Interaction ObjectのEventsのMessageを使って、特定オブジェクトにメッセージを送る(メソッドを呼び出す。IEnumeratorも呼べる)
ボタンを押したときにボールを離すこともやる。
■Interaction System Part 3
アニメーションとの連動
■Interaction System Part 4
相互干渉範囲の指定
CCDコンポーネントを使うことで、多脚の脚や戦車の砲台などもIKでコントロールすることができる。
■Full Body Biped IK Troubleshooting
後半は最初の回と似たような内容だった
■UMA Integration
スクリプトでFBBIKをaddComponetするときの注意点
■Interaction System Basics
第4回とほぼ同じ
■Combining IK Solvers (Aim + FBBIK + LookAt)
おさらい&内容が古いので割愛
- 前回のAimのキャラクターにFBBIKをアタッチ
- guaranteeの意味は保証
- initiatedの意味は開始
- budgeの意味は身動きする
- LookAtIK初登場
- Hand Weightを1
- Headに頭を指定
■Interaction System Part 2
Interaction ObjectのEventsのMessageを使って、特定オブジェクトにメッセージを送る(メソッドを呼び出す。IEnumeratorも呼べる)
ボタンを押したときにボールを離すこともやる。
■Interaction System Part 3
アニメーションとの連動
■Interaction System Part 4
相互干渉範囲の指定
Final IKについて(その6)
■FBBIK Grounder
- Full Body Biped IK (以降FBBIKと略される)のアタッチされたキャラクターにGround FBBIKをアタッチする。(検索では略語になっていない)
- 歩きたい場所のレイヤーを指定する(動画ではDefaultとした)
- キャラクターのレイヤーは除外すること
*excludeの意味は除外する - IKに歩行するキャラクター(=キャラクター自身)を指定する
- ちなみにanimatorのroot motionで歩かせると障害物を無視して進んでいった(root motionの仕様なのだと思うが情報つかめず)
パラメーターについて
- Max Stepがオフセットの最大値を決定する
- Predictionが大きいほど、より遠くの障害物の形状に合わせようとする
2016年11月12日土曜日
Final IKについて(その5)
■Full Body Biped IK - Linking Effectors to Objects
*前回の内容と似ているが、この回では簡単なスクリプトを書く- Full Body Biped IKをアタッチ(厄介なことに動画のinspectorは旧式)
- Cubeを配置し、コライダーを削除する
- ゲームをいったん再生状態にする
- 右手と左手のEffectorのWeight PositionとRotationを1にする
- 箱を持った状態になるよう、手の位置や角度を調整する
- Full Body Biped IKにより手の位置は固定できているが、指の位置は固定できない
そこで、手の調整が終わったらゲームの再生を一時停止にする- 重要なのはAnimatorの非アクティブなので、こちらはあまり気にしなくてよい
- このとき、Animatorを非アクティブにしないと調整できない(Animatorに上書きされる)
- この状態で指のボーンを調整する(ゲームの再生をやめれば元に戻る)
- 調整が終わったら、両手をコピーする
- ゲームの再生を終える
- ボーンの調整はかなり時間のかかる作業なので、前回同様キャラクターを複製して編集したほうが無難に思う
- コピーした両手をCubeの子オブジェクトにする
- 位置情報のみで視覚的には何も表示されない
スクリプトの作成
- 名前区間にusing RootMotion.FinalIK;
- 作成したスクリプトをキャラクターにアタッチ
- 指先を再現するためには、同梱されている「Hand Poser.cs」をアタッチし、Pose RootにCubeの対応する手の子オブジェクトを指定する
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using UnityEngine; | |
using System.Collections; | |
using RootMotion.FinalIK; | |
public class HoldCube : MonoBehaviour { | |
public FullBodyBipedIK ik; | |
public Transform leftHandTarget, rightHandTarget; | |
// Update is called once per frame | |
void LateUpdate () { | |
//左手 | |
ik.solver.leftHandEffector.position = leftHandTarget.position; | |
ik.solver.leftHandEffector.rotation = leftHandTarget.rotation; | |
ik.solver.leftHandEffector.positionWeight = 1f; | |
ik.solver.leftHandEffector.rotationWeight = 1f; | |
//右手 | |
ik.solver.rightHandEffector.position = rightHandTarget.position; | |
ik.solver.rightHandEffector.rotation = rightHandTarget.rotation; | |
ik.solver.rightHandEffector.positionWeight = 1f; | |
ik.solver.rightHandEffector.rotationWeight = 1f; | |
} | |
} |
2016年11月11日金曜日
Final IKについて(その4)
■InteractionSystem Part 1
- Full Body Biped Ikをアタッチ
- 球体のオブジェクトを用意
- コライダーを削除
- Interaction Objectをアタッチ
- Interaction Objectの設定
- Weight Curveのsizeを1にして、設定を入力できるようにする
- TypeはPosition Weightのままで良く、Curveはクリックして次のように設定する。このとき、キーはダブルクリック(もしくは右クリック>Add Key)で追加できる。キーを右クリック>Edit Keyを使うと直接数値を入力出来て便利。
- キャラクターに戻り、Interaction System Test GUIをアタッチ(これにより、Interaction Systemもアタッチされる)
- Interaction System Test GUIの設定
- Interaction Objectに先ほどの球体を指定する
- Effectorsのsizeを1にして、Left handにする
- ゲームを再生するとゲームビューにボタンが追加されている。このボタンを押すと、球に手を伸ばす動作が再生される。
- 球体に戻り、Interaction Objectの一番下にあるEventをsize1にする
- timeに0.5、ポーズにチェックを入れると指定時間で一時停止するようになる
- Multiplierのsizeを1にする
- Multiplierを1にする(これが影響度なので、0のままだと何も起こらない)
- ResultをRotate Bone Weightにする(Rotation Weightでもいいらしい)
- これで再生すると、手を捻って触れようとする。この回転はInteraction Objectがアタッチされている球体のRotationに依存している。xの向きの逆を向こうとしているように思える。
- 再生中に編集した設定は、コンポーネント名を右クリック>Copy Componentしておけば、再生後に再度右クリックで値をペーストできる
球体の特定の位置に手を置きたい場合
- キャラクターを複製する
- 複製した手のパーツだけを球体の任意の位置に移動させ、指も含めて手の形を子のみの状態に調整する
- 手を球体の子オブジェクトにする
- 複製したキャラクターを削除する
- このとき、子オブジェクトにした手も見えなくなるが問題ない(親のマテリアルがなくなったため透明になった?)
- 子オブジェクトにした手にInteraction Targetコンポーネントをアタッチする
- Effector Type をleft handにする
- この状態でゲームを再生しボタンを押すと、先程の手の形を再現するようになる
- キャラクターの手にHand Poserコンポーネントをアタッチする
- 球体のInteraction ObjectのMultiplierのsizeを2にする
- 追加した要素のResultをPoser Weightにする
- ゲームを再生すると、球体に手を置いたとき指の動きが固定される
- ここで球体の子オブジェクトの手の形を修正する
- 修正が終わったら、手の子オブジェクトをコピーする
- ゲームの再生を終え、手の子オブジェクトを削除してから、先ほどコピーした手のオブジェクトをペーストし、球体の子オブジェクトにし直す
キャラクターの位置が変わったとき不自然のないように修正
- 球体子オブジェクトのInteraction TargetのPivotに球体を指定する
- これによりキャラクターの位置に合わせて、手を置く位置が変わる。尚、これは手を伸ばしたときの話であり、ボールに触れた状態でキャラクターを移動させても手の位置は変わらない。
- Rotate Onceのチェックを外すと、常に位置を修正するようになる。
Position Offset(実演無し)
- 球体のInteraction ObjectのWeight Curveに要素を追加し、Typeをposition offset Yにする
- Curveを0.25秒のとき値が0.25くらいになるようにする(形は動画参照)
- Position Offset Spaceに何か指定すればそちらをオフセットにできるといっているが、実演無し
- 試しに球体を指定してみたところ、2回目以降は球体が回転しなくなった(手を置く位置が再現されなくなった)
Reach
- 手の動きを制限できるようだが、良く分からず
ボールを取る
- 球体のInteraction ObjectのEventをポーズからpick upに変える
- これによりボールを取って、キャラクターの手の子オブジェクトにすることができる
Final IKについて(その3)
■FINAL IK TUTORIAL - Basics of Setting Up AimIK
- Aim Ikコンポーネントをアタッチ
- Aim Transformには銃や手などを指定する。銃であれば先端に空の子オブジェクトを配置し、それを指定するとよい。
- Aim Transformの下にAxisがあるので、これをAim Transformに指定したオブジェクトのローカル軸と合わせる
- Bonesで指定できるボーンを追加できるので、ここにspine(背骨)のボーン(3つある?)と、neck(首)のボーンを指定する
- この時点でゲームを再生すると、ターゲットが自動的に用意されテストすることができる。Mecanimeでアニメーションを再生していても銃口はターゲットを向いている。
- この状態だと体がのけぞるので、Animatorの修正が必要。
- UpperBodyレイヤーを作成し、アニメーションを追加
- 元のレイヤー:Standing Breathe(腕を下げている)
- 追加したレイヤー:Standing Front(銃を構えている)
- projectに「Avatar Mask」アセットを作成(Upper Bodyと名付けた)
- 背骨の影響度が1だと背骨もターゲットに向くような感じになり、かなり不自然になる。影響度は低めにして姿勢が崩れないようにした方が自然。
- 標的が真後ろ近くにあるとかなり強引に腰をひねってしまう。Clamp Weightを0.5くらいにすると自然な角度で必要以上に追従しなくなる。
- 腕が不自然なのは後で修正する
Pole Targetの解説
- Game Objectを新たに作成し、Pole Targetに指定する
- ターゲットのAxisの時と同様に、Pole Axisを設定する
- Pole Weightを1にする
- これにより、追従する軸を追加することができる(ターゲットを狙いながら体を45°傾けるなど)
更に修正
- Upper Arm, Fore Arm, Handのボーンを更に追加する
- どうもこれは、
子オブジェクトである必要がありそう(親子関係の不明な孫オブジェクトは指定できない模様)子オブジェクトが複数(兄弟オブジェクト)ある場合は、それを無視して孫オブジェクトを指定できない模様。 - 連なったボーンになる必要がある模様
2016年11月10日木曜日
Final IKについて(その2)
■FINAL IK TUTORIAL - FullBodyBipedIK Inspector
- Position Weightで位置を動かす
- Rotation Weightで回転させる
- これは複数の個所を同時に固定することも可能
- 度々出てくるsolverはIT用語で、目的の値を逆算する機能のこと
- インスペクターの変数名にカーソルを乗せると詳しい説明が表示される
- コンポーネント名のところ右クリックで、ユーザーマニュアルなども参照できる
- 「Fix Transform」「Root Node」とその下の「Weight」「Iteration(反復)」「use Thigh(タイ=大腿)」についての解説(聞き取れず)。実演しなかったので、あまり気にしなくても大丈夫かも。
- Fix Transform:強制的に姿勢を矯正する機能
- Root Node:中心となるソルバ。WeightとIterationは影響力。
- Body以外にはBend Goalというパラメータがあり、これにオブジェクトを指定することで、その位置に引っ張られる感じにできる
- 分からないところは、コンポーネント右クリックでユーザーマニュアルへ。対応するコンポーネントのマニュアルに飛べるよう。
参考
Final IKについて(その1)
同梱のReadmeにチュートリアルページなどへの案内が書いてある。このチュートリアルを見るのが初めにやることになりそう。ちなみに、Shared Demo Assetsの中にダミー君がいる。
参考
動画の内容(全15回)
*リンク先はこのブログの該当記事- 基本操作について(このページ)
- インスペクターについて
- 武器を標的に向ける
- 物を掴んで子オブジェクトにする
- 物を掴む(ここから字幕&スクリプト)
- 地形に合わせて歩く
- rigの調整やカスタマイズ
- トラブルシューティング
- UMA Integration
- アニメモーションが地形にめり込むのを回避
- 相互干渉システムの基本的な使い方
- Aim + FBBIK + LookAtを組み合わせる
- 相互干渉システム(音声のみに戻る)
- 相互干渉システムでボタンを押す
- 相互干渉できる角度や距離の指定
■FINAL IK TUTORIAL - Basics of Setting Up FullBodyBipedIK
- Bipedとは「2足歩行動物」のこと
- AnimatorのUpdateModeはNormalかAnimate Phisics
- FullBodyBipedIKをアタッチしても、動画のような青いパーツは現れない。...と思ったが、何かの拍子に表示された。
- MMDを変換したFBXのAnimation TypeはGenericでも良いはずだが、アタッチするとRootNode以降が表示されない。Humanoidにしたら大丈夫なようである(参考)。
- Humanoidのときの内容と比較してみたところ、Referenceの一部が違っていた。Humanoidと同じにしてみたところ解決した。
- この影響か不明だが、修正が終わった後で他のキャラクターを見てみたところ、Aim IKコンポーネントが修正した初音ミクのFull Body Biped IKに上書きされていた。早めにプレハブにして、何かあったときに戻せるようにした方が無難かも。Unity内でFBXを複製したせいかもしれない。...気づいたら直っていた。青いパーツが表示されなかったりと、反映が遅いような仕様があるのかもしれない。
- limbの意味は「四肢」
- 肘、膝には小さな矢印があり、これが赤で異常を示しているときは、少し角度を調整すれば直るらしい
- ゲームを再生 > Left Arm > Position Weight を1 > 表示された四角をダブルクリックで、左手を引っ張ったりできるようになった。
- これはロボットの膝の矢印が外を向いていておかしな動きになることを示すためだったよう。FullBodyIKのインスペクターを固定して、膝のジョイントを修正する。
- このとき、膝の上と下の線が直線になるようにし、膝の矢印は真正面を向くようにする。
参考
2016年11月9日水曜日
AssetStoreの利用規約
アセットの利用権限について調べたら、思いの外苦労した。購入しようとしているアセットに独自ライセンスがあればそちらが含まれ、特に何も表示されていなければAssetStoreの利用規約が適用される。
このAssetStoreの利用規約は今のところ英語しかない。法的な話なので読むのが辛いが、コピーを禁止しているのでプロジェクト単位で使う必要があるとだけ知っておけば大丈夫だと思う。
【追記】
...と思ったが、コピーしなくても一度購入すればプロジェクトまたいでインポートできるから、ユーザー単位かもしれない。
このAssetStoreの利用規約は今のところ英語しかない。法的な話なので読むのが辛いが、コピーを禁止しているのでプロジェクト単位で使う必要があるとだけ知っておけば大丈夫だと思う。
【追記】
...と思ったが、コピーしなくても一度購入すればプロジェクトまたいでインポートできるから、ユーザー単位かもしれない。
UnityのGameビューが荒く見えるとき(Scaleの問題)
Unity5からだと思うが、Gameビューにscaleが追加された。これ自体は便利なのだが、無意識にマウスホイールしていると、気づいたら何故か画質が悪いという事態に陥る。原因が分からず、カメラや設定などを見直してしまった。
2016年11月8日火曜日
GearVR + Unityについて
Unite2015のGearVRの講談資料。
開発の導入は基本はこちらに従う。OculusがUnityの推奨バージョンを公開しているので意識しておいた方がよい。
GearVRはOculusとSamusunが共同開発したデバイス(参考)。なので、GearVRでも「Oculus Signature File」という署名ファイルが必要。この設定にデバイスIDが必要なのだが、ひどく手間取った。
このデバイスIDとは出力先のAndroid端末のIDのこと。USBで繋いで、端末側の「USBデバッグ」を有効にしておく必要がある。その他嵌りそうなポイントはこちら。なお、adbコマンドはどのディレクトリからでも使える模様。コマンドはdevicesなので注意。
動画やスクリーンショットの撮り方(参考)
解像度は2560×1440(参考)
再生時にVRの視点にする(参考)
そのうち役に立ちそうな情報集(参考)
ASTCは高画質な圧縮形式のこと(参考)
開発の導入は基本はこちらに従う。OculusがUnityの推奨バージョンを公開しているので意識しておいた方がよい。
■Oculus Signature File
GearVRはOculusとSamusunが共同開発したデバイス(参考)。なので、GearVRでも「Oculus Signature File」という署名ファイルが必要。この設定にデバイスIDが必要なのだが、ひどく手間取った。このデバイスIDとは出力先のAndroid端末のIDのこと。USBで繋いで、端末側の「USBデバッグ」を有効にしておく必要がある。その他嵌りそうなポイントはこちら。なお、adbコマンドはどのディレクトリからでも使える模様。コマンドはdevicesなので注意。
■カメラ周りの仕様(+映像周り)
- VRに使われるカメラはMainCameraではなく、Depthにおいて一番手前にあるカメラ(参考)
- カメラのtransfromはVR装着時に上書きされる(参考)
- Quality SettingsのLOD Baisは開発時は1にしておき、ビルド時のみ2にすると良い(VRでは画面が2分割されるので、開発画面の画面比率100%はVRの場合50%となるため)
- 冒頭のUnite2015資料の通り、画面が2分割されるので描画負荷が2倍になる
■UI関連
- UIで使えるのはWorld Spaceのみ(参考)
- CanvasのRender Modeを一旦「Screen Space-Camera」にして、MainCameraを指定して、UIとの距離を指定してから、Render Modeを「World Space」する必要があるっぽい。ただし、私の場合はうまく行かなかった(尚、Screen Space-CameraScreenについてはこちら)
- 普段通りに作ってから、scaleを0.01くらいにする。(参考:Unity uGUIを使うには)
- カメラにUIを張り付かせると不快感が強い(参考)
■デバッグ関連
- Unityのプロファイラー
- 手順
- 出力する端末のIPアドレスを取得しておく
- アプリをDevelopment Buildでビルドする
- アプリの起動している状態で、Windows>Profilerでプロファイラーを開く
- Active Profilerに先程のIPアドレスを入力
- 接続できているのに出力が更新されないとき(参考)
- 一旦アプリを終了させる
- 別アプリ関係なく更新が止まること多々あり
- プロファイラー結果の出力(参考1)
- エクセルなどには出力できない
- 基本的にはエディタ拡張を使う
- 手順
- Profiler.enableBinaryLog = true;としたうえで、Profiler.enabled = true;とすることで、自動的にログと詳細な不可データ(.data)が指定フォルダに出力される
- 何も表示されていないプロファイラ画面を開く
- エディタ拡張でProfiler.AddFramesFromFile(ログファイル名);とすると、プロファイラ画面にデータを読み込ませることができる
- GearVRの開発者モード
- これをONにするとHMD(HeadMountDisplayの略)を使わなくても2分割画面で起動できる(参考)
- Android6.0では下記だった
- [Settings (設定)] > [Application] >[Application Manager]
- [Storage] > [Manage Storage]
- HMDに接続しなくても良いものはこれでOK
- 開発者モードの切り替えの下に「アプリリストにアイコンを追加」という項目もある。これをやっておけば次からアクセスが楽になる。アイコンを起動した画面の右上の「その他(More)」を押す。
- Wifi経由でADBを取得する
- Wifi経由でMonitorにてログを確認できる(参考)
- adbコマンドの際は実機が待機画面でないこと!Oculus Signature Fileのとき同様、嵌りポイントに注意。
- HMDに接続しなきゃいけない場合に利用
- adb usb でUSBモードに戻すときは、Wifiで端末に接続出来ているので、USBをつながなくてもよい(繋ぐと1個以上のデバイス/エミュレーターが確認されたと出てエラーになった)
■ゲームパッドについて
- 基本的にはどのパッドも同じキーが割り当てられている(こちらのゲームパッドを使うには参照)
- 例えば、右ジョイスティックを使いたい場合
- Edit>Project Settings>Inputに移動
- sizeを増やして、追加できるようにする
- ジョイスティックのHorizontalやVerticalを参考にして、Axisを4th axisなどにする
- 名前はHorizontal2などにするとよい
- スクリプトで使うときは、Input.GetAxis("Horizontal2")のようにする
- 製品名+Unityでググれば、きっと誰かが検証してくれているはず
- Steel Series
- 自分のコントローラーはLR=4, 5だった。(X Boxと同じ気がする)
■影について
- シャドウカスケードはモバイルプラットフォームでは使えない(参考)
- ソフトシャドウはモバイルプラットフォームでは使えない(参考)
- この二つが使えないだけで、下図のような影響がある(最高画質の設定で比較)
- 下図のカメラの角度だとこのように映る。真上から映すともう少し綺麗に描写される。
ただし、Shadow Distanceを短くすると改善される。(この影響が非常に大きい)
外部プラグイン無しで開発できるが、Oculus特有の機能を使いたい場合はOculus Utilities for Unityを使ってね、というのが現在の構図となっている。
GearVRは戻るボタン長押しで動画やスクリーンショットが撮影できるとあるが、このbackボタンの挙動もOculus Utilities for Unityに含まれている(Oculus助け合い所にて回答あり)。backボタンの挙動追加はこちら。backボタンの挙動がないと審査で落ちるらしい。
尚、紹介したサイトではOVRManager自体にカメラをトラックする機能は無いとあったが、現在は自動で目の前に表示するようになっていた。なので、ボリュームUIをカメラに追従させる仕組みは自前で用意しなくて大丈夫。
Unity内のカメラは自動的にOVRCameraRigプレハブに置き換わるようで、現在のこのプレハブには初めからOVRManagerがアタッチされている。なので、用意しなくてもボリュームUIは実装されている。この流れでいえば、いずれOVR Platform Menu もプレハブに内包されるかも…。
センサーが使いたかったが何故か値が0だった。どうやらUnity側のバージョンアップで修正されたらしい。日本には情報が無いので海外のフォーラムを探すことになりそう(参考)。
- 代案:Dynamic Shadow
代案2:巨大スケールをあきらめてShadowDistanceを小さくする- カメラに映る大きさの比率で決まっているため無意味
- 嵌りポイント
- LightのResolutionがミディアムになったままで若干ハマった。LightとQuaritySettingsの両方を最高品質にする必要あり。というか、LightのResolutionは「Use Quality Settings」にしておけば間違いがない。
- VRのせいではないのだが、Unity上では問題ないのに、VR内では物体の近くまで接近しないと影が表示されない問題に悩まされた。Edit>Project Settings>Qualityで画質設定が確認できるのだが、AndroidはSimpleとなっている。SimpleのShadow Distanceは20であり、巨大な世界観だと今回の問題が起きた。
■負荷の削減など
- DINOTOWNのスマホ移行(参考)
■Oculus Utilities for Unity
過去はUnityでOculus系のVR開発をするのに必要だったが、ver.1.3.0でOVRPluginが切り離され、これがUnity側に統合された(Unity5.3.4p5 以降)。そのため、現在では外部プラグインが不要となっている。ただし、両者のバージョンアップに対応するための最低限の部分の統合であり、意図的に機能は制限されている。(参考)。外部プラグイン無しで開発できるが、Oculus特有の機能を使いたい場合はOculus Utilities for Unityを使ってね、というのが現在の構図となっている。
GearVRは戻るボタン長押しで動画やスクリーンショットが撮影できるとあるが、このbackボタンの挙動もOculus Utilities for Unityに含まれている(Oculus助け合い所にて回答あり)。backボタンの挙動追加はこちら。backボタンの挙動がないと審査で落ちるらしい。
尚、紹介したサイトではOVRManager自体にカメラをトラックする機能は無いとあったが、現在は自動で目の前に表示するようになっていた。
Unity内のカメラは自動的にOVRCameraRigプレハブに置き換わるようで、現在のこのプレハブには初めからOVRManagerがアタッチされている。なので、用意しなくてもボリュームUIは実装されている。この流れでいえば、いずれOVR Platform Menu もプレハブに内包されるかも…。
センサーが使いたかったが何故か値が0だった。どうやらUnity側のバージョンアップで修正されたらしい。日本には情報が無いので海外のフォーラムを探すことになりそう(参考)。
■その他
VR端末の戻る長押しでメニューを開けるらしいが、これが出来ず...。上記の通り、Oculus Utilities for Unityを導入して、backボタンの挙動を追加する必要があった。- 尚、動画を撮っても音は録音されないとのこと。説明書には録音できるとあるが、誤記らしい(Oculus助け合い所にて回答あり 2016.10.12)。
2016年11月7日月曜日
Unity IAPを試す(その2)
基本となるのは次の2つの資料。
- Unityチュートリアル(参考)
- Unite2016Tokyoトレーニングデイ(スライド)
- 19ページ目にサンプルデータのURLが示されている
- 「購入ボタンと購入APIを紐づける」にてサンプルデータのPurchaser.csが要求される
- このPurchaser.csはUnityチュートリアルのPurchaser.csに日本語訳を添えたものであり、内容は同じだと思われる
- Workshopと名の付くものが練習用、Completeと名の付くものが完成見本だと思われる
主にUnite2016Tokyoトレーニングデイに従い、テストしてみる。気になった点のみ抜粋する。
- Unity IAPのインポートで導入されるのはPluginsフォルダのみ
- IStoreListener を継承することでUnity Purchasing からメッセージを取得できる
- BuyProductID(nameID)でアイテム購入
- 非同期でProcessPurchase か OnPurchaseFailedが呼ばれる
- 成功時はProcessPurchase(PurchaseProcessingResult型で引数がPurchaseEventArgs型)が呼ばれ、このメソッドの中に各種アイテムが購入されたときの処理を書く
- アイテムIDはInitializePurchasingの中でも使われている
- ストアのIDはそれに対応する変数に記入する
- 例えばGooglePlayなら「kProductNameGoogle~」の方に記入する
- InitializePurchasing内にて、ストアIDと汎用IDの結びつけが行われている
- スライドにてアイテムを登録するところで触れられているので一読のこと
- GooglePlayのラインセンスキーを入力する話が無い(参考)
Unity IAPのメリット
- クロスプラットフォームであり、デバイス別の記述をしなくてよい
Unity IAPを試す(その1)
Unity IAP(In App Purchaser)でググると情報が見つかる。
今回は2016年11月にノンコーディングになったらしいのでそれを試す。(参考、ドキュメント)
IAPボタンの作成は、window→serviceからUnity IAPをインポイートした際に同梱されるEditorに含まれている模様。
閑話
ビルド時にDevelopment buildを外し忘れて、Google Play Developer Consoleのアップロードで弾かれた。
また、消費アイテムの登録に戸惑った。管理対象アイテムにして、ゲーム内で消費するようにとのこと。(参考)
あと、アンケート式レーティングは保存ではなく、算定→適用。
実機にapkをインストールするとき、「名前とは異なる署名のパッケージが既にインストールされています」と出てインストールできなかった。原因は他のアプリのBundle Identifierが重複しているためらしい。「com.~.app2」のように名前を変えたらインストールできた。(参考)
閑話休題
ドキュメントに従い、IAP Buttonを追加する。追加後にやることは概ね下記の3つ。
試しに成功時と失敗時はログだけ表示するようにして、Unity上でテストプレイしてみた。
さて、これをAndroid実機で動かしてみたところボタンは反応するが、成功にも失敗にもならない。どうやら初期化の時点でエラーが出ているらしい。よくよく考えれば、Google Playの公開鍵すらUnity上で設定していない。
というわけで、従来のやり方を調べてみる。
→次回
参考
今回は2016年11月にノンコーディングになったらしいのでそれを試す。(参考、ドキュメント)
IAPボタンの作成は、window→serviceからUnity IAPをインポイートした際に同梱されるEditorに含まれている模様。
閑話
ビルド時にDevelopment buildを外し忘れて、Google Play Developer Consoleのアップロードで弾かれた。
また、消費アイテムの登録に戸惑った。管理対象アイテムにして、ゲーム内で消費するようにとのこと。(参考)
あと、アンケート式レーティングは保存ではなく、算定→適用。
実機にapkをインストールするとき、「名前とは異なる署名のパッケージが既にインストールされています」と出てインストールできなかった。原因は他のアプリのBundle Identifierが重複しているためらしい。「com.~.app2」のように名前を変えたらインストールできた。(参考)
閑話休題
ドキュメントに従い、IAP Buttonを追加する。追加後にやることは概ね下記の3つ。
- ボタンが押されたときに購入されるアイテムIDの登録
- 成功時のイベント
- 失敗時のイベント
試しに成功時と失敗時はログだけ表示するようにして、Unity上でテストプレイしてみた。
さて、これをAndroid実機で動かしてみたところボタンは反応するが、成功にも失敗にもならない。どうやら初期化の時点でエラーが出ているらしい。よくよく考えれば、Google Playの公開鍵すらUnity上で設定していない。
というわけで、従来のやり方を調べてみる。
→次回
参考
登録:
投稿 (Atom)