我正在集成光子双关在我的项目,以显示两个(播放器01,播放器02)屏幕上的播放器01设备(相同的播放器02)。它几乎与分割屏幕相同。目前,我正在服务器上实例化球,以便在这两种设备上显示。球表现得很好,但它不带精灵,这是球预制组在生代时随机采取的。
我以前尝试过分屏相机,但这对我不起作用,因为最初我必须在服务器上同步生成的球,以便在两个播放器设备上显示它们。
这就是我的球体生成函数调用的地方。
Bubble one = GetOneBubbleAtPosition(Misc.IndexToPosition(_boundRect, new
Index(i, j)), Bubble.CharToType(c)); // Calling Instantiate bubble funtion
one.transform.parent = _parentBalls.transform;
_grid.Set(i, j, one);我在服务器上实例化球的函数和每一代精灵的选择
private Bubble GetOneBubbleAtPosition(Vector3 position, Bubble.Type type = Bubble.Type.None) // Bubble Generation Function
{
//var go = Instantiate(ball, position, Quaternion.identity) as GameObject;
var go = PhotonNetwork.Instantiate(Path.Combine("PhotonPrefebs", "ball") , position, Quaternion.identity) as GameObject;
go.transform.localScale = new Vector3(25f, 25f, 1.0f);
if (type == Bubble.Type.None)
{
type = Bubble.GetRandomColorFromList(_grid.GetAllUniqueTypes());
}
SpriteRenderer render = go.GetComponent<SpriteRenderer>();
render.sprite = getBubbleSprite (type);
Bubble bubble = go.GetComponent<Bubble>();
bubble.type = type;
return bubble;
}这就是它调用getBubbleSprite的雪碧的地方
private Sprite getBubbleSprite(Bubble.Type type)
{
switch (type) {
case Bubble.Type.Color1:
return _bubble_1;
case Bubble.Type.Color2:
return _bubble_2;
case Bubble.Type.Color3:
return _bubble_3;
case Bubble.Type.Color4:
return _bubble_4;
case Bubble.Type.Color5:
return _bubble_5;
case Bubble.Type.Color6:
return _bubble_6;
case Bubble.Type.Color7:
return _bubble_7;
case Bubble.Type.Color8:
return _bubble_8;
}
return null;
}这是GetRandomColorFromList函数:
public static Type GetRandomColorFromList(List<Type> all)
{
if (all.Count > 0)
{
if (all.Count == 1)
return all[0];
while (true)
{
int index = Random.Range(0, all.Count);
if (all[index] == _lastTwo && all[index] == _lastOne)
{
continue;
}
_lastTwo = _lastOne;
_lastOne = all[index];
return all[index];
}
}
D.warn("[Bubble] Get none type...");
return Type.None;
}这是GetAllUniqueTypes函数:
public List<Bubble.Type> GetAllUniqueTypes()
{
List<Bubble.Type> all = new List<Bubble.Type>();
for (int i = 0; i < G.rows; i++)
{
for (int j = 0; j < G.cols; j++)
{
var one = _grids[i, j];
if (one != null)
{
Bubble.Type type = one.type;
if (!all.Contains(type))
{
all.Add(type);
}
}
}
}
return all;
}最后3个函数正在实例化函数中调用,我还尝试在调用第一个函数时发送RPC。
我希望这个球可以在服务器上生成,并且在每个设备上都显示得很完美。
发布于 2019-07-23 09:05:03
我不知道光子及其具体的语法,但与其在GetBubbleStPosition上使用RPC,不如将其拆分,并在类似的方法上使用RPC
[PunRPC]
private void SetSprite(int viewID, int typeInt)
{
type = (Bubble.Type) typeInt;
var pv = PhotonView.Find(viewID);
pv.transform.localScale = new Vector3(25f, 25f, 1.0f);
SpriteRenderer render = pv.GetComponent<SpriteRenderer>();
render.sprite = getBubbleSprite(type);
Bubble bubble = pv.GetComponent<Bubble>();
bubble.type = type;
}把它叫做
private Bubble GetOneBubbleAtPosition(Vector3 position, Bubble.Type type = Bubble.Type.None) // Bubble Generation Function
{
//var go = Instantiate(ball, position, Quaternion.identity) as GameObject;
var go = PhotonNetwork.Instantiate(Path.Combine("PhotonPrefebs", "ball") , position, Quaternion.identity) as GameObject;
if (type == Bubble.Type.None)
{
type = Bubble.GetRandomColorFromList(_grid.GetAllUniqueTypes());
}
// The RPC call
PV.RPC("SetSprite", RpcTarget.AllBuffered, PhotonView.Get(go).ViewID, (int)type);
return bubble;
}感谢@ your :如果没有先登记,您就无法传递自定义类型。相反,只需将Bubble.Type转换到int并将其传输出去。
就像我说的,我对光子一无所知,到目前为止只使用UNet。但是这里有人说通过RPC作为参数发送GameObject实际上是不可能的。而是使用PhotonView并在RPC调用中传递PhotonView.ViewID。
我只知道UNet,在那里,您必须确保实例化的GameObject也附加了一个NetworkIentity。我想PhotonView与此类似,因此您的实例化预置组件是一个附加的PhotonView组件,以便能够在所有客户端上通过网络识别它。
https://stackoverflow.com/questions/57159399
复制相似问题