どーも。今日も元気にUnityやっていますか?
シューティングゲームやアクションゲームを作っている時に、
プレイヤーと壁にコライダーをつけて、衝突判定を行いたいときに、貫通してしまう場面がありませんか?
先人たちの見解によると、だいたい片方のオブジェクトの速度が早すぎることが原因であるとされていますが、速度を変えたくないことだってあるでしょう。
その時にRaycastを使って、スクリプトから制御できるようにしてみます。
public LayerMask collisionLayers; // 衝突を検出するレイヤーマスク
public float rayDistance = 1.0f; // Rayの距離
void Update()
{
// プレイヤーの移動
Vector2 playerPosition = transform.position;
Vector2 moveDirection = Vector2.zero;
if(Input.GetKey(KeyCode.LeftArrow))
{
moveDirection = Vector2.left;
}
if(Input.GetKey(KeyCode.RightArrow))
{
moveDirection = Vector2.right;
}
if(Input.GetKey(KeyCode.UpArrow))
{
moveDirection = Vector2.up;
}
if(Input.GetKey(KeyCode.DownArrow))
{
moveDirection = Vector2.down;
}
if (moveDirection != Vector2.zero)
{
// 衝突判定をRaycastで行う
RaycastHit2D hit = Physics2D.Raycast(transform.position, moveDirection, rayDistance, collisionLayers);
if (hit.collider == null)
{
// Rayが何にも当たっていない場合、移動を行う
playerPosition += moveDirection * moveSpeed * Time.deltaTime;
transform.position = playerPosition;
}
}
}
このコードをプレイヤーなどの動くオブジェクトにアタッチし、インスペクターから
判定を取りたいレイヤーを選択すれば、衝突時の貫通現象から脱却することができる。
以上、参考までに。
コメント