🌟

UnityでのRayCastを出す1人称視点のプレイヤー処理

2023/09/21に公開

1人称視点のプレイヤーにおいて、RayCastを利用した攻撃処理などの基本形となるプログラムです。備忘録としてまとめておきます

RayCastの基本処理

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private GameObject mainCamera;
    private int rayDistance = 20;
    public GameObject ballPrefab;
    public GameObject markerPrefab;
    private GameObject marker;

    // Start is called before the first frame update
    void Start()
    {
        // メインカメラを取り出す
        mainCamera = GameObject.Find("MainCamera");
        // プレイヤー(メインカメラ)の前方向を取り出す
        Vector3 rayDestPosition = mainCamera.transform.forward;
	// マーカーを作成する(なくてもよい)
        marker = Instantiate(markerPrefab,
            mainCamera.transform.position +
            rayDestPosition * 
	    rayDistance,
            transform.rotation) as GameObject;
    }

    // Update is called once per frame
    void Update()
    {
      // メインカメラ(プレイヤー)の現在位置
        Vector3 rayOriginPosition = mainCamera.transform.position;
	// RayCastを飛ばす方向
        Vector3 rayDestPosition = mainCamera.transform.forward;
	// マーカーの位置を調整する。メインカメラの方向に合わせてマーカーが移動する
        marker.transform.position = rayOriginPosition + rayDestPosition * rayDistance;
	// Xを押下
        if (Input.GetKeyDown(KeyCode.X))
        {
	    // Ray作成
            Ray ray = new Ray(rayOriginPosition, rayDestPosition);
            // 発射地点
            //Instantiate(ballPrefab, rayOriginPosition, transform.rotation);
            // 着弾地点
            // Instantiate(ballPrefab, rayOriginPosition + rayDestPosition * rayDistance, transform.rotation);

            // デバッグ用のレイキャストの補助線
            Debug.DrawRay(
	        ray.origin,
                ray.direction* rayDistance, 
		Color.red, 5, false);
	    // Rayの衝突判定用オブジェクト
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, rayDistance))
            {
	        // 衝突
                if (hit.collider.tag == "enemy")
                {
		    // 衝突時の処理
                    GameObject enemy = hit.collider.gameObject;
		    // その他の衝突処理
                }
            }
        }
    }
}

Discussion