首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在光子服务器上加载实例化对象,从而改变sprite的生成(Sprite同步)

如何在光子服务器上加载实例化对象,从而改变sprite的生成(Sprite同步)
EN

Stack Overflow用户
提问于 2019-07-23 08:00:23
回答 1查看 954关注 0票数 0

我正在集成光子双关在我的项目,以显示两个(播放器01,播放器02)屏幕上的播放器01设备(相同的播放器02)。它几乎与分割屏幕相同。目前,我正在服务器上实例化球,以便在这两种设备上显示。球表现得很好,但它不带精灵,这是球预制组在生代时随机采取的。

我以前尝试过分屏相机,但这对我不起作用,因为最初我必须在服务器上同步生成的球,以便在两个播放器设备上显示它们。

这就是我的球体生成函数调用的地方。

代码语言:javascript
复制
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);

我在服务器上实例化球的函数和每一代精灵的选择

代码语言:javascript
复制
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的雪碧的地方

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
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。

我希望这个球可以在服务器上生成,并且在每个设备上都显示得很完美。

EN

回答 1

Stack Overflow用户

发布于 2019-07-23 09:05:03

我不知道光子及其具体的语法,但与其在GetBubbleStPosition上使用RPC,不如将其拆分,并在类似的方法上使用RPC

代码语言:javascript
复制
[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;
}

把它叫做

代码语言:javascript
复制
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组件,以便能够在所有客户端上通过网络识别它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57159399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档