耗時一周制作的第一人稱射擊游戲,希望能幫助到大家!
這里寫目錄標題
- 代碼
- FPS_KeyPickUp.cs
- FPS_LaserDamage.cs
- FPS_PlayerContorller.cs
- FPS_PlayerHealth.cs
- FPS_PlayerInput.cs
- FPS_PlayerInventory.cs
- FPS_PlayerParameters.cs
- HashIDs.cs
- Tags.cs
代碼
FPS_KeyPickUp.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FPS_KeyPickUp : MonoBehaviour
{
public AudioClip keyClip; //鑰匙音效
public int keyId; //鑰匙編號
private GameObject player; //玩家
private FPS_PlayerInventory playerInventory; //背包
private void Start()
{
player = GameObject.FindGameObjectWithTag(Tags.player);
playerInventory = player.GetComponent<FPS_PlayerInventory>();
}
private void OnTriggerEnter(Collider other)
{
if(other.gameObject == player)
{
AudioSource.PlayClipAtPoint(keyClip, transform.position);
playerInventory.AddKey(keyId);
Destroy(this.gameObject);
}
}
}
FPS_LaserDamage.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FPS_LaserDamage : MonoBehaviour
{
public int damage = 20; //傷害值
public float damageDelay = 1; //傷害延遲時間
private float lastDamageTime = 0; //上一次收到傷害的時間
private GameObject player; //玩家
private void Start()
{
player = GameObject.FindGameObjectWithTag(Tags.player);
}
private void OnTriggerStay(Collider other)
{
if(other.gameObject == player && Time.time > lastDamageTime + damageDelay)
{
player.GetComponent<FPS_PlayerHealth>().TakeDamage(damage);
lastDamageTime = Time.time;
}
}
}
FPS_PlayerContorller.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum PlayerState
{
None, //初始狀態
Idle, //站立
Walk, //行走
Crouch, //蹲伏
Run //奔跑
}
public class FPS_PlayerContorller : MonoBehaviour
{
private PlayerState state = PlayerState.None;
/// <summary>
/// 人物狀態設定
/// </summary>
public PlayerState State
{
get
{
if (runing)
{
state = PlayerState.Run;
}
else if (walking)
{
state = PlayerState.Walk;
}
else if (crouching)
{
state = PlayerState.Crouch;
}
else
{
state = PlayerState.Idle;
}
return state;
}
}
public float sprintSpeed = 10f; //沖刺速度
public float sprintJumpSpeed = 8f; //沖刺跳躍速度
public float normalSpeed = 6f; //正常速度
public float normalJumpSpeed = 7f; //正常跳躍速度
public float crouchSpeed = 2f; //蹲伏速度
public float crouchJumpSpeed = 6f; //蹲伏跳躍速度
public float crouchDeltaHeight = 0.5f; //蹲伏下降高度
public float gravity = 20f; //重力
public float cameraMoveSpeed = 8f; //相機跟隨速度
public AudioClip jumpAudio; //跳躍音效
public float currentSpeed; //當前速度
public float currentJumnSpeed; //當前跳躍速度
private Transform mainCamera; //主攝像物件
private float standardCamHeight; //相機標準高度
private float crouchingCamHeight; //蹲伏時相機高度
private bool grounded = false; //是否在地面上
private bool walking = false; //是否在行走
private bool crouching = false; //是否在蹲伏
private bool stopCrouching = false; //是否停止蹲伏
private bool runing = false; //是否在奔跑
private Vector3 normalControllerCenter = Vector3.zero; //角色控制器中心
private float normalControllerHeight = 0f; //角色控制器高度
private float timer = 0; //計時器
private CharacterController characterController; //角色控制器組件
private AudioSource audioSource; //音頻源組件
private FPS_PlayerParameters parameters; //FPS_Parameters組件
private Vector3 moveDirection = Vector3.zero; //移動方向
/// <summary>
/// 初始化
/// </summary>
private void Start()
{
crouching = false;
walking = false;
runing = false;
currentSpeed = normalSpeed;
currentJumnSpeed = normalJumpSpeed;
mainCamera = GameObject.FindGameObjectWithTag(Tags.mainCamera).transform;
standardCamHeight = mainCamera.position.y;
crouchingCamHeight = standardCamHeight - crouchDeltaHeight;
audioSource = this.GetComponent<AudioSource>();
characterController = this.GetComponent<CharacterController>();
parameters = this.GetComponent<FPS_PlayerParameters>();
normalControllerCenter = characterController.center;
normalControllerHeight = characterController.height;
}
private void FixedUpdate()
{
MoveUpdate();
AudioManager();
}
/// <summary>
/// 任務移動控制更新
/// </summary>
private void MoveUpdate()
{
//如果在地面上
if (grounded)
{
//自身坐標軸的y軸對應世界坐標軸的z軸
moveDirection = new Vector3(parameters.inputMoveVector.x, 0, parameters.inputMoveVector.y);
//將 direction 從本地空間變換到世界空間
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= currentSpeed;
//如果玩家輸入跳躍
if (parameters.isInputJump)
{
//獲取跳躍速度
CurrentSpeed();
moveDirection.y = currentJumnSpeed;
//播放跳躍音頻
AudioSource.PlayClipAtPoint(jumpAudio, transform.position);
}
}
//受重力下落
moveDirection.y -= gravity * Time.deltaTime;
//CollisionFlags 是 CharacterController.Move 回傳的位掩碼,
//其概述您的角色與其他任何物件的碰撞位置,
CollisionFlags flags = characterController.Move(moveDirection * Time.deltaTime);
/*
CollisionFlags.CollidedBelow 底部發生了碰撞"flags & CollisionFlags.CollidedBelow"回傳1;
CollisionFlags.CollidedNone 沒發生碰撞"flags & CollisonFlags.CollidedNone"回傳1;
CollisionFlags.CollidedSides 四周發生碰撞"flags & CollisionFlags.CollidedSides"回傳1;
CollisionFlags.CollidedAbove 頂端發生了碰撞"flags & CollisionFlags.CollidedAbove"回傳1;
*/
//表示在地面上,grounded為true
grounded = (flags & CollisionFlags.CollidedBelow) != 0;
//如果在地面上且有移動的輸入
if (Mathf.Abs(moveDirection.x) > 0 && grounded || Mathf.Abs(moveDirection.z) > 0 && grounded)
{
if (parameters.isInputSprint)
{
walking = false;
crouching = false;
runing = true;
}
else if (parameters.isInputCrouch)
{
walking = false;
crouching = true;
runing = false;
}
else
{
walking = true;
crouching = false;
runing = false;
}
}
else
{
if (walking)
{
walking = false;
}
if (runing)
{
runing = false;
}
if (parameters.isInputCrouch)
{
crouching = true;
}
else
{
crouching = false;
}
}
//蹲伏狀態下的角色控制器中心與高度
if (crouching)
{
characterController.height = normalControllerHeight - crouchDeltaHeight;
characterController.center = normalControllerCenter - new Vector3(0, crouchDeltaHeight / 2, 0);
}
else
{
characterController.height = normalControllerHeight;
characterController.center = normalControllerCenter;
}
CurrentSpeed();
CrouchUpdate();
}
/// <summary>
/// 根據人物的狀態對其速度進行定義
/// </summary>
private void CurrentSpeed()
{
switch (State)
{
case PlayerState.Idle:
currentSpeed = normalSpeed;
currentJumnSpeed = normalJumpSpeed;
break;
case PlayerState.Walk:
currentSpeed = normalSpeed;
currentJumnSpeed = normalJumpSpeed;
break;
case PlayerState.Crouch:
currentSpeed = crouchSpeed;
currentJumnSpeed = crouchJumpSpeed;
break;
case PlayerState.Run:
currentSpeed = sprintSpeed;
currentJumnSpeed = sprintJumpSpeed;
break;
}
}
/// <summary>
/// 根據人物狀態對其腳步聲進行定義
/// </summary>
private void AudioManager()
{
if(State == PlayerState.Walk)
{
//設定音頻源的音高,行走時緩慢
audioSource.pitch = 0.8f;
if (!audioSource.isPlaying)
{
audioSource.Play();
}
}
else if(State == PlayerState.Run)
{
//設定音頻源的音高,奔跑時急促
audioSource.pitch = 1.3f;
if (!audioSource.isPlaying)
{
audioSource.Play();
}
}
else
{
audioSource.Stop();
}
}
/// <summary>
/// 蹲伏下降與蹲伏上升時相機位置更新
/// </summary>
private void CrouchUpdate()
{
if (crouching)
{
if (mainCamera.localPosition.y > crouchingCamHeight)
{
if(mainCamera.localPosition.y-(crouchDeltaHeight * Time.deltaTime * cameraMoveSpeed)< crouchingCamHeight)
{
mainCamera.localPosition = new Vector3(mainCamera.localPosition.x, crouchingCamHeight, mainCamera.localPosition.z);
}
else
{
mainCamera.localPosition -= new Vector3(0, crouchDeltaHeight * Time.deltaTime * cameraMoveSpeed, 0);
}
}
else
{
mainCamera.localPosition = new Vector3(mainCamera.localPosition.x, crouchingCamHeight, mainCamera.localPosition.z);
}
}
else
{
if (mainCamera.localPosition.y < standardCamHeight)
{
if(mainCamera.localPosition.y + (crouchDeltaHeight * Time.deltaTime * cameraMoveSpeed) > standardCamHeight)
{
mainCamera.localPosition = new Vector3(mainCamera.localPosition.x, standardCamHeight, mainCamera.localPosition.z);
}
else
{
mainCamera.localPosition += new Vector3(0, crouchDeltaHeight * Time.deltaTime * cameraMoveSpeed, 0);
}
}
else
{
mainCamera.localPosition = new Vector3(mainCamera.localPosition.x, standardCamHeight, mainCamera.localPosition.z);
}
}
}
}
FPS_PlayerHealth.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class FPS_PlayerHealth : MonoBehaviour
{
public bool isDead; //是否死亡
public float resetAfterDeathTime = 5; //死亡后重置時間
public AudioClip deathClip; //死亡時音效
public AudioClip damageClip; //受傷害時音效
public float maxHp = 100; //生命值上限
public float currentHp = 100; //當前生命值
public float recoverSpeed = 1; //回復生命值速度
public Text hpText;
private float timer; //計時器
private FadeInOut fader; //FadeInOut組件
private FPS_Camera fPS_Camera;
private void Start()
{
currentHp = maxHp;
fader = GameObject.FindGameObjectWithTag(Tags.fader).GetComponent<FadeInOut>();
fPS_Camera = GameObject.FindGameObjectWithTag(Tags.mainCamera).GetComponent<FPS_Camera>();
BleedBehavior.BloodAmount = 0;
hpText.text = "生命值:" + Mathf.Round(currentHp) + "/" + Mathf.Round(maxHp);
}
private void Update()
{
if (!isDead)
{
currentHp += recoverSpeed * Time.deltaTime;
hpText.text = "生命值:" + Mathf.Round(currentHp) + "/" + Mathf.Round(maxHp);
if (currentHp > maxHp)
{
currentHp = maxHp;
}
}
if (currentHp < 0)
{
if (!isDead)
{
PlayerDead();
}
else
{
LevelReset();
}
}
}
/// <summary>
/// 受到傷害
/// </summary>
public void TakeDamage(float damage)
{
if (isDead)
return;
//播放受傷音頻
AudioSource.PlayClipAtPoint(damageClip, transform.position);
//將值限制在 0 與 1 之間并回傳其傷害值
BleedBehavior.BloodAmount += Mathf.Clamp01(damage / currentHp);
currentHp -= damage;
}
/// <summary>
/// 禁用輸入
/// </summary>
public void DisableInput()
{
//將敵人相機禁用
transform.Find("Player_Camera/WeaponCamera").gameObject.SetActive(false);
this.GetComponent<AudioSource>().enabled = false;
this.GetComponent<FPS_PlayerContorller>().enabled = false;
this.GetComponent<FPS_PlayerInput>().enabled = false;
if (GameObject.Find("BulletCount") != null)
{
GameObject.Find("BulletCount").SetActive(false);
}
fPS_Camera.enabled = false;
}
/// <summary>
/// 玩家死亡
/// </summary>
public void PlayerDead()
{
isDead = true;
DisableInput();
AudioSource.PlayClipAtPoint(deathClip, transform.position);
}
/// <summary>
/// 關卡重置
/// </summary>
public void LevelReset()
{
timer += Time.deltaTime;
if (timer > resetAfterDeathTime)
{
fader.EndScene();
}
}
}
FPS_PlayerInput.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FPS_PlayerInput : MonoBehaviour
{
/// <summary>
/// 鎖定滑鼠屬性
/// </summary>
public bool LockCursor
{
get
{
//如果滑鼠是處于鎖定狀態,回傳true
return Cursor.lockState == CursorLockMode.Locked ? true : false;
}
set
{
Cursor.visible = value;
Cursor.lockState = value ? CursorLockMode.Locked : CursorLockMode.None;
}
}
private FPS_PlayerParameters parameters;
private FPS_Input input;
private void Start()
{
LockCursor = true;
parameters = this.GetComponent<FPS_PlayerParameters>();
input = GameObject.FindGameObjectWithTag(Tags.gameController).GetComponent<FPS_Input>();
}
private void Update()
{
InitialInput();
}
/// <summary>
/// 輸入引數賦值初始化
/// </summary>
private void InitialInput()
{
parameters.inputMoveVector = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
parameters.inputSmoothLook = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y"));
parameters.isInputCrouch = input.GetButton("Crouch");
parameters.isInputFire = input.GetButton("Fire");
parameters.isInputJump = input.GetButton("Jump");
parameters.isInputReload = input.GetButtonDown("Reload");
parameters.isInputSprint = input.GetButton("Sprint");
}
}
FPS_PlayerInventory.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FPS_PlayerInventory : MonoBehaviour
{
private List<int> keysArr; //鑰匙串列
private void Start()
{
keysArr = new List<int>();
}
/// <summary>
/// 添加鑰匙
/// </summary>
public void AddKey(int keyId)
{
if (!keysArr.Contains(keyId))
{
keysArr.Add(keyId);
}
}
/// <summary>
/// 是否有對應門的鑰匙
/// </summary>
/// <param name="doorId"></param>
/// <returns></returns>
public bool HasKey(int doorId)
{
if (keysArr.Contains(doorId))
return true;
return false;
}
}
FPS_PlayerParameters.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//當你添加的一個用了RequireComponent組件的腳本,
//需要的組件將會自動被添加到game object(游戲物體),
//這個可以有效的避免組裝錯誤
[RequireComponent(typeof(CharacterController))]
public class FPS_PlayerParameters : MonoBehaviour
{
[HideInInspector]
public Vector2 inputSmoothLook; //相機視角
[HideInInspector]
public Vector2 inputMoveVector; //人物移動
[HideInInspector]
public bool isInputFire; //是否開火
[HideInInspector]
public bool isInputReload; //是否換彈
[HideInInspector]
public bool isInputJump; //是否跳躍
[HideInInspector]
public bool isInputCrouch; //是否蹲伏
[HideInInspector]
public bool isInputSprint; //是否沖刺
}
HashIDs.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HashIDs : MonoBehaviour
{
public int deadBool;
public int speedFloat;
public int playerInSightBool;
public int shotFloat;
public int aimWidthFloat;
public int angularSpeedFloat;
private void Awake()
{
deadBool = Animator.StringToHash("Dead");
speedFloat = Animator.StringToHash("Speed");
playerInSightBool = Animator.StringToHash("PlayerInSight");
shotFloat = Animator.StringToHash("Shot");
aimWidthFloat = Animator.StringToHash("AimWidth");
angularSpeedFloat = Animator.StringToHash("AngularSpeed");
}
}
Tags.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 封裝標簽
/// </summary>
public class Tags
{
public const string player = "Player"; //玩家
public const string gameController = "GameController"; //游戲控制器
public const string enemy = "Enemy"; //敵人
public const string fader = "Fader"; //淡入淡出的畫布
public const string mainCamera = "MainCamera"; //主攝像機
}
一個堅持學習,堅持成長,堅持分享的人,即使再不聰明,也一定會成為優秀的人!
整理不易,如果看完覺得有所識訓的話,記得一鍵三連哦,謝謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/274819.html
標籤:其他
