カテゴリー
制作

ポーズ機能を試作

ゲーム中にいわゆるメニュー画面を表示することを考えて、ポーズ機能を作り始めてみた。
スクリプトの制御でtransformを直接変えたりしている場合は「一時停止フラグが立っていたら何もせずにreturnさせる」などでこれを停止させれば良いはず。
RigidBody を使っている場合は、一時停止フラグが立っている間Is Kinematicをtrueにすればよいと思ったが、これだけでは停止直前に働いていた慣性が失われてしまう。
そこで、停止時にRigidbody.Velocityの値をVector3変数にコピーしておき、一時停止の解除時にコピーした値をRigidbody.Velocityに戻す方法を試してみた。

フラグの管理はシーン管理者のブール変数で行う。
停止の管理が必要なオブジェクトは、シーン開始時にシーン管理者のタグから管理者のインスタンスを取得しており、停止フラグを参照できるようにした。負荷を軽くするため、停止と再開の処理は一時停止管理用のフラグが変わるときにのみ行う事にした。
各オブジェクトは、シーン管理者の停止フラグがtrueになったら、velocityの保存、IsKinematicフラグをtrueにするなどの処理を行ってから自身の停止フラグをtrueにする。
逆にシーン管理者の停止フラグがfalseになった場合は、IsKinematicフラグをfalseにし、保存したvelocityを取り出して自身の停止フラグをfalseにする。

後々アニメーションなどを追加するともっと考える事が増えるかもしれない。

カテゴリー
制作

シーン管理者を追加

前回、視線の先にあるアイテムを消すところまで実装したのでその先の処理を少しだけ追加。

シーン管理用のオブジェクトを追加。このオブジェクトはアイテム取得や管理以外に様々な管理を行う予定。Scene Masterのタグをつける。
シーンに配置されているアイテムはシーン開始時にタグを使ってシーン管理者を見つけ、Get Component関数でシーン管理者用のスクリプトを取得。アイテムがプレイヤーに拾われた際にシーン管理者のアイテム取得用の関数を呼び出す。拾われたアイテムのオブジェクトは破棄され、シーン管理者が管理しているアイテムの所持数を増やす。

一週間の進捗がこれだけではあまりに少ない。もっとメリハリ付けて作業を進めないといけないはずだが。
どうしても週末で気が緩むとだらだらと過ごしてしまいがちだ。週一のブログ更新とそのネタのための作業を何とかやってはいるが。

カテゴリー
制作

collider.SendMessageを実装

前回Physics.Raycastで一定距離のアイテム(などの対象物)に視線が当たっているかどうかを判定するようにした。
この時、レイが衝突した対象物に関する情報がRaycastHit変数に渡されている。
(RaycastHit名).collider.SendMessage((送るメッセージ)) で対象物の関数などを呼び出せる。この時呼び出される関数はpublicである必要は無い。
アイテム側にオブジェクトの破棄などの関数を作って呼び出すと、見た目上はアイテムを拾ったように見える。後で所持品に追加などの処理を追加していけばよい。

コントローラの入力スクリプトはプレイヤーとなるオブジェクトにアタッチしていたが、入力用のオブジェクトを独立させる事にした。
プレイヤーはコントローラで動かす頻度が高い対象ではあるが、いわゆるポーズ画面とかメニュー画面と呼ばれるものを呼び出しているときはコントローラが動かすものはプレイヤーではない。カーソルだったりスライダーだったりと、同じボタンでも状況によって動かす対象を変える必要がある。

カテゴリー
制作

Raycast

一人称視点でアイテムを拾えるようにするため、レイヤーマスクとレイキャストを使うことにしたので覚書を書いておく。以前も使ったことがあるけど、しばらく触らないとすぐに忘れてしまう。

  • Physics.Raycastによって得られる情報はRaycastHit構造体で受け取る。
  • Debug.DrawRay を使うとScene画面で確認できる光線を表示する。
    引数は 開始位置、向きと長さ、色、消えるまでの時間、カメラから隠れた線を描画するかどうか。
  • レイヤーマスクを指定するとビットが1のレイヤーに対してのみ判定を行う。
    ビットのシフト演算や反転などを使うとコードが分かりやすくなる。
  • DrawRay は方向も長さも一つのベクトルで指定するのに対し、Raycast はベクトルで方向、float変数で最大距離を指定する。

とりあえずProBuilderで適当にアイテムっぽいものを作って床に置き、レイを飛ばすスクリプトをプレイヤーのカメラにアタッチ。近づいて視線を向ける事でレイが当たっている事を確認できた。
上記でレイが当たるオブジェクトはアイテム用のレイヤーでマスクされている。
RaycastHit を使いアイテムにアタッチされているはずのコンポーネントを取得しメソッドを呼び出す、という流れでアイテムに何らかの操作ができるはず。

とは言ったものの全然進んでいない…。週末にまとまった時間があっても疲れていることを自分への言い訳にしている気がする。もっとモチベーションを高めるにはどうしたらいいのだろうか。
作品を作ることが面白すぎて止め時が分からない、という状態になるにはどうすればいいのか。それとも作品を作るのは楽しいというより苦しいけどやる、というものなのか。単純に作品をつくるという事に自分は向いていないのか。
…という事を考えるのもブログのネタになりそうではある。