FPS遊戲之射擊
阿新 • • 發佈:2018-11-12
最近在做策劃給的一些關於FPS型別的需求,Demo基本已經成型,接下來整理並記錄,高手略過,不喜勿噴!!!
廢話不多說,直接上程式碼
public float fireTime; //開火時間 public float coolTime=0.01f; //開火冷卻時間 void Update() { if (fireTime < coolTime) { fireTime += Time.deltaTime * 3; //當fireTime小於coolTime 的時候 firetime開始增加到fireTime } if (fireTime > coolTime) { fireTime = coolTime; } if (IsFire) { Ray ray = Camera.main.ScreenPointToRay(screenPos); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { if (hit.collider != null && hit.collider.tag != "Player" && fireTime == coolTime) { //當前第一人稱 if (weaponCamera.gameObject.activeInHierarchy) { fristWeapons[weaponIndex].GetComponent<FPS_Weapon>().Shoot(hit); } else { threeWeapons[weaponIndex].GetComponent<FPS_Weapon>().Shoot(hit); } } }
射擊程式碼涉及到第一人稱和第三人稱切換以及武器的切換,物件池,特效播放,音效播放等在後面會持續更新
public void Shoot(RaycastHit hit) { //槍口特效 ShootFXFLash.SetActive(true); ShootFXFLash.GetComponent<ParticleSystem>().Play(); //子彈生成(直接動態生成) //GameObject bullet = Instantiate(BulletPrefab, ShootBulletPos.position, Quaternion.identity) as GameObject; //子彈生成(提前生成一批) //GameObject bullet = bulletsPool[bulletIndex]; //物件池 GameObject bullet = FPS_ObjectPool.GetInstance().GetObj("GenericBulletRayOnly");//子彈名稱 bullet.SetActive(false); bullet.GetComponent<FPS_Bullet>().timeToLive = 2; bullet.transform.position = ShootBulletPos.position; bullet.transform.rotation = ShootBulletPos.rotation; bullet.transform.LookAt(hit.point); bullet.GetComponent<Rigidbody>().velocity = (hit.point - ShootBulletPos.position) * 10f; bullet.SetActive(true); //音效播放 PlayShootAudio(); }
shoot方法裡有直接生成子彈,提前生成一批子彈和物件池獲取子彈三種生成子彈的測試方式,
射擊方法2
只有射擊軌道,沒有實彈,利用射線碰撞的敵人,設定彈道軌道痕跡,獲取敵人身上的傷害指令碼賦值傷害
void Shoot() { particleSystem.Play(); this.lineRenderer.enabled = true; lineRenderer.SetPosition(0, transform.position); //判斷射擊到敵人時的遊戲邏輯 Ray ray = new Ray(transform.position, transform.forward); RaycastHit hitInfo; if (Physics.Raycast(ray, out hitInfo)) { lineRenderer.SetPosition(1, hitInfo.point); //判斷當前的射擊有沒有碰撞到敵人 if (hitInfo.collider.tag == Tags.enemy) { hitInfo.collider.GetComponent<EnemyHealth>().TakeDamage(attack,hitInfo.point); } } else { lineRenderer.SetPosition(1, transform.position + transform.forward * 100); } audio.Play(); Invoke("ClearEffect", 0.05f); }