1. 程式人生 > >FPS遊戲之射擊

FPS遊戲之射擊

最近在做策劃給的一些關於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);
    }