今回のビデオでは新しい概念が同時に複数出てきたために、私は理解するのに大分時間が掛かりました
しかし、今ではそれを理解することができたので、自分自身に対する説明の意味を含めて「CameraRaycaster.cs」の一部を解説用に変更し、解説コメントを追加したものをここに置いていきます
//Layer[] layerPriorities = {
// Layer.Enemy,
// Layer.Walkable
//};
// ↑これを↓これに置き換えた
string[] layerPriorities =
{
"Enemy",
"Walkable",
};
void Update()
{
foreach (string layer in layerPriorities)
{
RaycastHit? hit = RaycastForLayer(layer);
// 戻り値「hit」に値がある(=Rayが何かに当たった)場合
if (hit.HasValue)
{
// Rayが当たった情報を使ってあれこれする
Debug.Log("Hit.Value = " + hit.Value + ", HitLayer = " + layer);
return;
}
}
// この行まで処理が来たということは、layerPrioritiesのすべてのレイヤーに対してRayを飛ばしても当たらなかったということ
// なので、最大距離(distanceToBackground)まで飛ばしてLayerに当たらなかった(RaycastEndStop) として設定
Debug.Log("Hit.Value = " + distanceToBackground + ", HitLayer = " + "RaycastEndStop");
}
RaycastHit? RaycastForLayer(string layer)
{
//int layerMask = 1 << (int)layer;
// ↑これを↓これに置き換えた
int layerMask = LayerMask.GetMask(layer); // 結果として得られるintの値は Physics.Raycast メソッドに LayerMask として渡すためだけのもの。
// 結果の値はint型だが、Physics.Raycast メソッド内では byte[] に置き換えられて、各byteを各Layerの検知判定のbool値として利用している。
// つまり、layerMaskのintとしての値に直接の意味はないし、この値を見て正常な結果かどうか判断するのは難しい。
// 正しい値になっているかの確認は、実際にPhysics.Raycast メソッドを実行して望みの結果が得られるかを確認するほうがよい。
// viewCameraの位置から真正面へ向かってのRay(※スタート地点と進行方向を決めただけで、まだ実際にRayを飛ばしてはいない)
Ray ray = viewCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
// 実際にRayを飛ばす
// layerMaskのLayerを持つオブジェクトだけとぶつかる
bool hasHit = Physics.Raycast(ray, out hit, distanceToBackground, layerMask);
// hasHit: True = 飛ばしたRayが何かに当たった , False = 飛ばしたRayが何にも当たらなかった
if (hasHit)
{
// Rayが当たった情報をReturnで返す
return hit;
}
// Rayが当たらなかったのでnullを返す
return null;
}
このコードはBenのコードを理解するための中間ポイントです。
私のコードを試した場合、次のビデオに進む前に綺麗で無駄のないBenのコードに戻してください。