网络游戏制作---坦克大战(3)

一、发射子弹

      这一部分实现玩家控制自己坦克发射子弹,而其他玩家保持不动。

      主要的思想使用RPC:

      1、首先为发射炮弹脚本添加PhotonView组件

      2、如果是本地组件,直接调用Fire()函数

      3、调用远程玩家的RPC的Fire()函数,来实现远程玩家的设计效果,进而实现同步。

代码如下:

    //初始化PhotonView组件变量
    private PhotonView pv = null;

    //向pv变量分配PhotonView组件
    pv = GetComponent<PhotonView>();

    void Update()
    {
        //如果PhotonView是自己本地的组件,则点击鼠标左键时执行发射逻辑
        if (pv.isMine&&Input.GetMouseButtonDown(0))
        {
            //如果是自己本地的坦克,则调用本地函数并发射炮弹
            Fire();

            //调用远程玩家客户端的RPC函数Fire函数
            pv.RPC("Fire", PhotonTargets.Others, null);
        }
    }

    [PunRPC]
    void Fire()
    {
        //播放炮弹发射的声音
        sfx.PlayOneShot(fireSfx, 1.0f);
        Instantiate(cannon, firePos.position, firePos.rotation);
    }

完整的FireCannon代码:

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

public class FireCannon : MonoBehaviour
{
    //炮弹预设
    private GameObject cannon = null;

    //炮弹发射声音
    private AudioClip fireSfx = null;
    //AudioSource组件
    private AudioSource sfx = null;

    //炮弹发射初始点
    public Transform firePos;

    //初始化PhotonView组件变量
    private PhotonView pv = null;

    void Awake()
    {
        //加载Resources文件夹中的Cannon预设
        cannon = (GameObject)Resources.Load("Cannon");

        //从Resources文件夹中加载炮弹声音文件
        fireSfx = Resources.Load<AudioClip>("CannonFire");
        //声明AudioSource变量
        sfx = GetComponent<AudioSource>();

        //向pv变量分配PhotonView组件
        pv = GetComponent<PhotonView>();
    }

    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        //如果PhotonView是自己本地的组件,则点击鼠标左键时执行发射逻辑
        if (pv.isMine&&Input.GetMouseButtonDown(0))
        {
            //如果是自己本地的坦克,则调用本地函数并发射炮弹
            Fire();

            //调用远程玩家客户端的RPC函数Fire函数
            pv.RPC("Fire", PhotonTargets.Others, null);
        }
    }

    [PunRPC]
    void Fire()
    {
        //播放炮弹发射的声音
        sfx.PlayOneShot(fireSfx, 1.0f);
        Instantiate(cannon, firePos.position, firePos.rotation);
    }
}

二、

猜你喜欢

转载自www.cnblogs.com/Optimism/p/11099263.html