オンラインFPS:射撃
+ボタン押下でコードを確認できます!
コピペしても正しく動かない場合は
エディタでアタッチし忘れている可能性が高いです。
- PlayerController
- This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { public Transform viewPoint;//カメラの位置オブジェクト public float mouseSensitivity = 1f;//視点移動の速度 private Vector2 mouseInput;//ユーザーのマウス入力を格納 private float verticalMouseInput;//y軸の回転を格納 回転を制限したいから private Camera cam;//カメラ private Vector3 moveDir;//プレイヤーの入力を格納(移動) private Vector3 movement;//進む方向を格納する変数 private float activeMoveSpeed = 4;//実際の移動速度 public Vector3 jumpForce = new Vector3(0, 6, 0);//ジャンプ力 public Transform groundCheckPoint;//地面に向けてレイを飛ばすオブジェクト public LayerMask groundLayers;//地面だと認識するレイヤー Rigidbody rb;// public float walkSpeed = 4f, runSpeed = 8f;//歩きの速度、走りの速度 private bool cursorLock = true;//カーソルの表示/非表示 public List<Gun> guns = new List<Gun>();//武器の格納配列 private int selectedGun = 0;//選択中の武器管理用数値 private float shotTimer;//射撃間隔 [Tooltip("所持弾薬")] public int[] ammunition; [Tooltip("最高所持弾薬数")] public int[] maxAmmunition; [Tooltip("マガジン内の弾数")] public int[] ammoClip; [Tooltip("マガジンに入る最大の数")] public int[] maxAmmoClip; private void Start() { //変数にメインカメラを格納 cam = Camera.main; //Rigidbodyを格納 rb = GetComponent<Rigidbody>(); //カーソル非表示 UpdateCursorLock(); } private void Update() { //視点移動関数 PlayerRotate(); //移動関数 PlayerMove(); //地面についているのか判定をする if (IsGround()) { //走りの関数を呼ぶ Run(); //ジャンプ関数を呼ぶ Jump(); } //銃の切り替え SwitchingGuns(); //覗き込み Aim(); //射撃関数 Fire(); //カーソル非表示 UpdateCursorLock(); } //Update関数が呼ばれた後に実行される private void LateUpdate() { //カメラをプレイヤーの子にするのではなく、スクリプトで位置を合わせる cam.transform.position = viewPoint.position; cam.transform.rotation = viewPoint.rotation; } /// <summary> /// Playerの横回転と縦の視点移動を行う /// </summary> public void PlayerRotate() { //変数にユーザーのマウスの動きを格納 mouseInput = new Vector2(Input.GetAxisRaw("Mouse X") * mouseSensitivity, Input.GetAxisRaw("Mouse Y") * mouseSensitivity); //横回転を反映(transform.eulerAnglesはオイラー角としての角度が返される) transform.rotation = Quaternion.Euler (transform.eulerAngles.x, transform.eulerAngles.y + mouseInput.x, //マウスのx軸の入力を足す transform.eulerAngles.z); //変数にy軸のマウス入力分の数値を足す verticalMouseInput += mouseInput.y; //変数の数値を丸める(上下の視点制御) verticalMouseInput = Mathf.Clamp(verticalMouseInput, -60f, 60f); //縦の視点回転を反映(-を付けないと上下反転してしまう) viewPoint.rotation = Quaternion.Euler (-verticalMouseInput, viewPoint.transform.rotation.eulerAngles.y, viewPoint.transform.rotation.eulerAngles.z); } /// <summary> /// Playerの移動 /// </summary> public void PlayerMove() { //変数の水平と垂直の入力を格納する(wasdや矢印の入力) moveDir = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical")); //Debug.Log(moveDir);説明用 //ゲームオブジェクトのz軸とx軸に入力された値をかけると進む方向が出せる movement = ((transform.forward * moveDir.z) + (transform.right * moveDir.x)).normalized; //現在位置に進む方向*移動スピード*フレーム間秒数を足す transform.position += movement * activeMoveSpeed * Time.deltaTime; } /// <summary> /// 地面についているならtrue /// </summary> /// <returns></returns> public bool IsGround() { return Physics.Raycast(groundCheckPoint.position, Vector3.down, 0.25f, groundLayers); } public void Jump() { //ジャンプできるのか判定 if (IsGround() && Input.GetKeyDown(KeyCode.Space)) { //瞬間的に真上に力を加える rb.AddForce(jumpForce, ForceMode.Impulse); } } public void Run() { //左シフトを押しているときはスピードを切り替える if(Input.GetKey(KeyCode.LeftShift)) { activeMoveSpeed = runSpeed; } else { activeMoveSpeed = walkSpeed; } } public void UpdateCursorLock() { //入力しだいでcursorLockを切り替える if (Input.GetKeyDown(KeyCode.Escape)) { cursorLock = false; } else if (Input.GetMouseButton(0)) { cursorLock = true; } //cursorLock次第でカーソルの表示を切り替える if (cursorLock) { //カーソルを中央に固定し、非表示 https://docs.unity3d.com/ScriptReference/CursorLockMode.html Cursor.lockState = CursorLockMode.Locked; } else { //表示 Cursor.lockState = CursorLockMode.None; } } /// <summary> /// 銃の切り替えキー入力を検知する /// </summary> public void SwitchingGuns() { if (Input.GetAxisRaw("Mouse ScrollWheel") > 0f) { selectedGun++;//扱う銃を管理する数値を増やす //リストより大きい数値になっていないか確認 if (selectedGun >= guns.Count) { selectedGun = 0;//リストより大きな数値になれば0に戻す } //実際に武器を切り替える関数 switchGun(); } else if (Input.GetAxisRaw("Mouse ScrollWheel") < 0f) { selectedGun--;//扱う銃を管理する数値を減らす if (selectedGun < 0) { selectedGun = guns.Count - 1;//0より小さければリストの最大数-1の数値に設定する } //実際に武器を切り替える関数 switchGun(); } //数値キーの入力検知で武器を切り替える for (int i = 0; i < guns.Count; i++) { if (Input.GetKeyDown((i + 1).ToString()))//ループの数値+1をして文字列に変換。その後、押されたか判定 { selectedGun = i;//銃を扱う数値を設定 //実際に武器を切り替える関数 switchGun(); } } } /// <summary> /// 銃の切り替え /// </summary> void switchGun() { foreach (Gun gun in guns)//リスト分ループを回す { gun.gameObject.SetActive(false);//銃を非表示 } guns[selectedGun].gameObject.SetActive(true);//選択中の銃のみ表示 } /// <summary> /// 右クリックで覗き込み /// </summary> public void Aim() { // マウス右ボタン押しているとき if (Input.GetMouseButton(1)) { //fieldOfViewコンポーネントの値を変更(開始地点、目的地点、補完数値) 開始地点から目的地点まで補完数値の割合で徐々に近づける cam.fieldOfView = Mathf.Lerp(cam.fieldOfView, guns[selectedGun].adsZoom, guns[selectedGun].adsSpeed * Time.deltaTime); } else { //60は初期設定数値 cam.fieldOfView = Mathf.Lerp(cam.fieldOfView, 60f, guns[selectedGun].adsSpeed * Time.deltaTime); } } /// <summary> /// 左クリックの検知 /// </summary> public void Fire() { if (Input.GetMouseButton(0) && ammoClip[selectedGun] > 0 && Time.time > shotTimer) { FiringBullet(); } } /// <summary> /// 弾丸の発射 /// </summary> private void FiringBullet() { //選択中の銃の弾薬減らす ammoClip[selectedGun]--; //Ray(光線)をカメラの中央からに設定 Ray ray = cam.ViewportPointToRay(new Vector2(.5f, .5f));//カメラの中心がこの数値 //レイを飛ばす(開始地点と方向、当たったコライダーの情報格納) if (Physics.Raycast(ray, out RaycastHit hit)) { Debug.Log("当たったオブジェクトは" + hit.collider.gameObject.name); } //射撃間隔を設定 shotTimer = Time.time + guns[selectedGun].shootInterval; } }
他の講座クーポン【93%OFF】
関連記事
クーポン期限2023/01/24 Udemyでは定価24000円になっていますがこのクーポンページからの購入で1800円台で購入することが可能になっています! 30日以内な[…]
Udemyよりお得に講座視聴可能なYouTubeメンバーシップ