BotWのHP構成が面白いなぁっていう話
BotWの体力構成が面白いなぁと思った。
リンクのHPは下記の構成でできている。
・ハート
・ミファーの祈り
・食べ物/薬
・ダルケルの護り
ハートは、祠を巡り克服の証を集めることで3→30まで増える(10倍)
ミファーの祈りは、ハート全回復+5個
ダルケルの護りは、敵の攻撃を3回まで防ぐことができる
食べ物/薬は無制限。
ゲーム進行によって単純にハートが増えるだけではなく、さらにミファーの祈りなどによって実質的な体力が20倍以上になる。
ゲーム資産として倍倍に増えていく実質的な体力によって、敵の攻撃力にも相当な幅をもたせることができる。
さらに「こんな強い敵を倒せるわけがない」という体験から食べ物/薬の価値も上がり、フィールドに点在する材料を手に入れるだけで楽しいという状況を作り出すことに成功している。
プレイヤーの成長実感がより強く演出されているだけでなく、小目標を達成する喜びの創出までもがゲーム全体の面白さへとつながっているのだ。
いや〜面白いわけだわ。
ちなみにダルケルの護りは敵の攻撃値によらず全ての攻撃を弾くため、その効果は強い敵と戦うほど高くなる(弱い敵と戦ってダルケルの護りが発動した時は「損した!」と思う)。これも強い敵に戦う心理的なハードルを下げる要因になり、強い敵に挑むためのあらゆる準備の価値が上がる。
強い敵に挑むためのハードルは高いが、HPが足し算ではなく掛け算で増えていくので、成長の快感が強い。
いや〜面白いわけだわ(2回目)。
アングリーバード風アプリ(始める前に)
ドーザーアプリを作ってプレファブとエフェクトを学ぶ⑥(完成)
今日はパーティクルでエフェクトをつけるよ。
---
パーティクルおもしれー(・∀・)
これで水でも炎でも表現できるとか凄すぎ。
で、パーティクルはオブジェクトをシーン上に生成するだけで再生されるけど、オブジェクト自体はパーティクルの再生が終わってもずっと残ったままなので、エフェクトオブジェクト自体に再生が終了したら自分自身を削除させるんだって。すごい背徳感あっていい。
---
Instantiate関数で動的にオブジェクトを生成するって③の記事の時にやったけど、分からないままだったのでここで調べておく。
>nstantiateの引数は、複製したいオブジェクト(Object)、位置(Vector3D)、回転(Quaternion)。
引数という言葉の概念を理解した私にはこの説明が何を言っているのか分かるぞ!
---
しかし、ちょくちょくコード内に出てくる「other.gameObject.tag」みたいなのはどういう意味?
要するに今作っているスクリプトだとOnTriggerEnterのパラメーターで、トリガー担ってるオブジェクトに入ってきた他のオブジェクトのことを指しているんですな。
---
次はサウンドの再生。
・Audio SourceコンポーネントにあるAudio Clipにサウンドファイルをくっつける。Play On Awakeにチェックを入れていると、オブジェクト生成時に音がなるようになる。
・Play On Awakeじゃなくてスクリプトから再生するにはPlay関数を呼び出す。
・あと最近はCRIを使っていたのであまり意識をしていなかったけど、Unityに直接オーディオクリップを設定するので最終的にはPCM, Vorbis, ADPCMっていうUnityのいずれかの圧縮形式で圧縮されるので、外部のツールで圧縮してからインポートするのではなく、非圧縮のファイルをインポートしてUnity側に圧縮を任せたほうがいい。
・Audio Mixerを使う。Audio Mixerもアセット扱いなので、ここで作ったグループを各Audio SourceコンポーネントのOutputパラメータに設定する。
Masterを選択した状態でグループを作る。親子関係に注意。
---
これで第4章はおしまい!
エフェクトと音がつくと楽しくなるね。
ドーザーアプリを作ってプレファブとエフェクトを学ぶ⑤
今日からはゲームロジック的な制御を追加。
とりあえず覚えた言葉を使ってみることで覚えようとしているよ。
---
"const"ってよく出てくるよね
const を付けて宣言された定数は、 その他の場所で値を書き換えることは出来ない。
---
"void"もよく出てくるよね
この記事がすごいありがたい。
ひとつの.csファイルでは、ファイル名と同じクラスをひとつだけ宣言するルール。
---
「引数」っていうのを理解していないので調べる。
ここに記載されていた
> 計算を行う際に関数に指定しなければならないもの
> 関数名の後ろの()内に指定する
> 何を指定するかは関数によって異なる
この例えがすっごい分かりやすかった。
---
コルーチン関数というものを使う。
コルーチンをStartCoroutine関数を使ってスタートさせて、内部でyieldを宣言してWaitForSecondsを使う。これでカウンターを作る。
---
OnGUIってのとfor文がよく分かんないぞ。
UnityをC#で超入門してみる #4 GUIの章 - Qiita
UnityをC#で超入門してみる #3 計算の章 - Qiita
この辺参考にした。
---
今日はこの辺まで。
キャンディの残数制限と回復ルール、連続ショット制限が入った。
スクリプト少しずーつ分かるようになってくるの面白い。
ドーザーアプリを作ってプレファブとエフェクトを学ぶ④
今日はスクリプト日和になりそう。
---
■shooterの改良
・丸いキャンディは3回に1回の頻度
・色はランダム
・タップした位置によって投入位置を連動させる
・オブジェクト動的生成と同時に自動でCandy Holderオブジェクトの子にする
---
そろそろC#の中身が分からなくなってきたのでこちらを読む
bool型ってのは変数の型だったのね。真偽型。
「%」は四則演算で左辺を右辺で割った余りを得る。
…そうか!GameObjectってfloatやintと同じように型だったのね。
制御構文とな。if / switch / do / while / for / foreach …foreachめんどくさい!あとで読む。
…継承のあたりでもうワケワカランくなってきたけどまぁ後で分かるようになるやろ。
---
と、ここまで読んでもう一度shooterのスクリプトを見返す。
ムスカ「読める…読めるぞぉ……!」
とまでは行かないまでも、なんとなーく「何を言おうとしているのか」は見えてきた。関数とかは全然覚えていないけど。
---
生成されたオブジェクトをDestroyするスクリプト作って、今日はここまで。
わーい色とりどりだぞー
ドーザーアプリを作ってプレファブとエフェクトを学ぶ③
今日はプレファブから。
球体のキャンディを作る。
→RigidbodyのAngular Drag(回転に対する空気抵抗)を設定して転がりすぎ防止。
・HierarchyビューからProjectビューにオブジェクトをドラッグ&ドロップすると、プレファブ化できる。簡単だね。
Assetにあったモデルデータをゲームビューにドラッグ&ドロップした時も Hierarchyビュー内の文字は青色だったけど、これはモデルデータと紐付いていたことを表しているのでプレファブ化されていたわけではないらしい。間違えそう。
・Mesh Colliderはオブジェクトの見た目通りのコライダーになる。ただしConvexにチェックを入れないと他のMesh Colliderと衝突判定がされないんだって?なるほど?(ただし三角形面数が255以下の場合のみ)
・複雑な形のものは、単純な形のコライダーで代用したほうが計算負荷を軽減できる。
・シーン上に配置されたプレファブをシーン上で編集すると、プレファブから参照しているパラメータに上書きされる(オーバーライド)。この場合、元のプレファブの値を変更してもオーバーライドした値の方が優先される。オーバーライドされてるパラメータはInspectorビュー上でふと文字で表示される。
・オブジェクトの動的生成にはInstantiate関数を用いる。いんすたんす化・・・?はて・・・。
・ここを参照して調べながらキャンディを打ち出すスクリプトを作成。
AddForce関数にTransformコンポーネントのforwardパラメータを渡し、
AddTorque関数には引数にVector3の値を指定する。
キャンディめっちゃ出るようになった。
まだ丸いのしか出ないので全然プッシュされない。
夕飯食べるのでまた今度〜
ドーザーアプリを作ってプレファブとエフェクトを学ぶ②
今日も眠いよ。
---
昨日はステージのオブジェクトを作ったので
今日はそこに装飾をつけていくところから。
既存の3Dモデルをインポートして配置。
QuadとPlaneはどう違うの?という疑問に答えてくれたサイトがこちら。
そうか、メッシュって頂点と三角形で構成されているものなのね。
QuadオブジェクトのPositionを貼り付けたい壁と全く同じ座標にすると表示が安定しないので、0.01だけずらす。
カメラとライトを調整して、いよいよプッシャーの実装。
オブジェクトを配置して、あとは繰り返し動くスクリプトをつける。
ここでUnityのスクリプトリファレンスの使い方を少し理解。
TransformクラスのlocalPosition関数
MathfクラスのSin関数
Timeクラスのtime関数
こういう感じね!(分かった風
Pusherオブジェクトにさっきのスクリプトをつける。
Rigidbodyを持つオブジェクトに影響を与えたい場合は
スクリプト側で動かすオブジェクトにもRigidbodyを付けるといい。
さらに、物理演算による影響を受けないようにIs Kinematicにチェックを入れる。
---
今日はここまで。
試しにゲームプレビューしてみた
プッシャーがそれっぽく動いてるー!これはテンション上がる