一、发射子弹
这一部分实现玩家控制自己坦克发射子弹,而其他玩家保持不动。
主要的思想使用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); } }
二、