PhotonCloud服务器之Maco Polo教程(Part IV)

发表于2016-08-07
评论0 2.7k浏览
Contents 目录
  1、Overview 概述
  2、Walking Vikings 行走的维京人
  3、Photon Cloud 光子云
  4、Starting From Scratch 写在前边的话
  5、Reception: Getting a Room 接受:获取一个房间(不是开房的意思→_→)
  6、Marco Polo: Syncing Positions 马可波罗:同步位置

  PhotonCloud服务器之Marco Polo教程(Part IV)
  7、Shout and Respond 喊叫和回应
  8、Switch “It” 转化“It”
  9、Conclusion 总结
  Shout and Respond 喊叫和回应
  如果我们的怪物能够说话,那肯定是一件很酷的事。我们可以录一些或者到网上找一个文本语音合成器(你们自己去找吧,找吧,找吧)。现在不管怎么样,我们先搞到连个音频片段(网址:http://http://www.fromtexttospeech.com/);
  The PhotonView.RPC() method can’t just call any method but only those with a special attribute: PunRPC. In code, this is [PunRPC] (and @PunRPC in unityScript).
PhotonView有一个方法叫做“远程过程调用”,简称“RPC”(跟unity里面的一样)。RPC的好处是:它能够调用在同一个房间内其他用户的方法(并且是同一个物体上组件,这个倒还真没有理解,实验结果,就是利用它上传到服务器上的用户需要共享的信息都是利用它来做的)。为了方便,它还可以在“这”个客户端调用该方法。
  PhotonView.RPC()方法只能调用那些带有特殊的属性(加个[ ]标签)的方法:PunRPC。代码中,“[PunRPC]““和@PunRPC”在UnityScript中这么显示。
  unity5.1明确表示RPC属性过时了,这个以后会被删除。正因如此,PUN1.56版本使用最新的一个属性:‘PunRPC’。所有其他使用RPC和“远程过程调用”的目前均不受影响。
  好了,我们可以使用RPC方法了,我们的怪物喊叫函数也挺好实现的——主要是通过区分本地和其他玩家的客户来实现的。在文件夹“MarcoPolo”中创建另一个脚本“AudioRpc”。添加的方法“Marco”和“Polo”,并在函数头添加PunRPC属性;接下来还需要添加公共AudioClip属性,这样你才能引用播放的声音文件。  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using UnityEngine;
   
public class AudioRpc : MonoBehaviour {
   
    public AudioClip marco;
    public AudioClip polo;
   
    [PunRPC]
    void Marco()
    {
        Debug.Log("Marco");
   
        this.audio.clip = marco;
        this.audio.Play();
    }
   
    [PunRPC]
    void Polo()
    {
        Debug.Log("Polo");
   
        this.audio.clip = polo;
        this.audio.Play();
    }
}
  接下来把两个音频文件“Marco ”“Polo”拖拽到“monsterprefab”,有一个“AudioRpc”属性的变量,对应着拖进去。我们还需要在预制物体上添加一个音频源AudioSource(主菜单,组件,音频,音频源,其实直接添加组件AudioSource也行)。为了方便起见,我们可以将按钮添加到RandomMatchmaker的OnGUI函数中,并调用RPC 的一些方法(详情见代码)。然而我们还没有获取到怪物的PhotonView组件呢,因此我们可以在怪物创建的同时就获取保存起立。修改代码如下 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private PhotonView myPhotonView;
   
void OnJoinedRoom()
{
    GameObject monster = PhotonNetwork.Instantiate("monsterprefab", Vector3.zero, Quaternion.identity, 0);
    monster.GetComponent().isControllable = true;
    myPhotonView = monster.GetComponent();
}
   
void OnGUI()
{
    GUILayout.Label(PhotonNetwork.connectionStateDetailed.ToString());
   
    if (PhotonNetwork.connectionStateDetailed == PeerState.Joined)
    {
        if (GUILayout.Button("Marco!"))
        {
            this.myPhotonView.RPC("Marco", PhotonTargets.All);
        }
        if (GUILayout.Button("Polo!"))
        {
            this.myPhotonView.RPC("Polo", PhotonTargets.All);
        }
    }
}
  请注意,这儿有不同的PhotonTargets选项。我们现在使用的是“所有”,而且还是本地播放声音。
  如果你现在运行两个客户端并单击按钮,声音可能会太小。滑动滚轮调高声音,你会听到有回声:两个客户端都播放了声音。而且“偏远”的玩家将有一个短暂的延迟(取决于网络延迟)。
  这只是一个差异测试,我们需要禁用RPC的背景音频。
  当应用程序失去焦点的时候,就在AudioRPC中实现OnApplicationFocus 并禁用掉脚本。然后再测试。回声依然存在。
  在被禁用的脚本中RPC被调用了。这可能是恼人的,但也可能这是一件好事。如果你想在禁用脚本跳过RPC,那就检查它的enabled。“Polo”代码如下:  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void OnApplicationFocus(bool focus)
{
    this.enabled = focus;
}
   
[PunRPC]
void Polo()
{
    if (!this.enabled)
    {
        return;
    }
   
    Debug.Log("Polo");
   
    this.audio.clip = polo;
    this.audio.Play();
}
   
// modify Marco() too
未完待续










如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引