Unity3d 精灵在creator计算机上的构建中正确更改,但在任何其他设备上都不会更改

Unity3d 精灵在creator计算机上的构建中正确更改,但在任何其他设备上都不会更改,unity3d,build,sprite,Unity3d,Build,Sprite,构建应用程序将创建一个完全工作的.exe或.app,当它完美运行时,它将具有所有功能,最重要的是,正确更改精灵。提到的精灵更改是当用户向不同方向移动时,脚本会相应地更改玩家游戏对象上的精灵。在编辑器和本地版本(.exe)中,一切都按预期工作 问题是,当生成文件夹(包括.exe)被发送到任何其他计算机时,精灵停止更改。只显示最初用于渲染游戏对象的主精灵 我尝试过从单文件精灵切换到精灵贴图,但也没有解决这个问题 最奇怪的是,在本地机器和编辑器上的每一个构建中,所有东西都按预期工作,但在任何其他设备(

构建应用程序将创建一个完全工作的.exe或.app,当它完美运行时,它将具有所有功能,最重要的是,正确更改精灵。提到的精灵更改是当用户向不同方向移动时,脚本会相应地更改玩家游戏对象上的精灵。在编辑器和本地版本(.exe)中,一切都按预期工作

问题是,当生成文件夹(包括.exe)被发送到任何其他计算机时,精灵停止更改。只显示最初用于渲染游戏对象的主精灵

我尝试过从单文件精灵切换到精灵贴图,但也没有解决这个问题

最奇怪的是,在本地机器和编辑器上的每一个构建中,所有东西都按预期工作,但在任何其他设备(PC/Windows、Mac/Mac OS X)上都不会

PS!我曾想,是否是因为最终构建中不包含精灵文件,而是在单个精灵贴图上添加所有精灵的问题应该解决了这个问题。而且,一切都在本地计算机上工作

PlayerControls.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;
using UnityEngine.Networking;

public class PlayerControls : NetworkBehaviour
{
    public Sprite westView;
    public Sprite eastView;
    public Sprite northView;
    public Sprite southView;

    public GameObject player;

    public float speed = 5f;

    private Tilemap tilemap;

    void Start()
    {
        tilemap = GameObject.Find("Grid/Walls").GetComponent<Tilemap>();
        player.GetComponent<EntityMove>().setSpeed(speed);
        player.GetComponent<EntityMove>().setTiles(tilemap);
        player.GetComponent<ControlSprite>().setSprites(new Sprite[] { northView, westView, eastView, southView});
    }

    void Update()
    {
        if (!isLocalPlayer)
        {
            return;
        }
        if (Input.GetKey(KeyCode.W)) { changeSprite(0); }
        else if (Input.GetKey(KeyCode.A)) { changeSprite(1); }
        else if (Input.GetKey(KeyCode.D)) { changeSprite(2); }
        else if (Input.GetKey(KeyCode.S)) { changeSprite(3); }
        player.GetComponent<EntityMove>().setTiles(tilemap);
    }

    [Client]
    private void changeSprite(int newDirection)
    {
        if (newDirection == 0) { gameObject.GetComponent<ControlSprite>().newSprite(player, northView, 0); }
        else if (newDirection == 1) { gameObject.GetComponent<ControlSprite>().newSprite(player, westView, 1); }
        else if (newDirection == 2) { gameObject.GetComponent<ControlSprite>().newSprite(player, eastView, 2); }
        else if (newDirection == 3) { gameObject.GetComponent<ControlSprite>().newSprite(player, southView, 3); }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.Tilemaps;
使用UnityEngine。联网;
公共类玩家控制:网络行为
{
公共精灵西景;
公共雪碧东景;
公共雪碧北景;
公共精灵南景;
公共游戏对象玩家;
公共浮子速度=5f;
私人Tilemap Tilemap;
void Start()
{
tilemap=GameObject.Find(“网格/墙”).GetComponent();
player.GetComponent().setSpeed(速度);
player.GetComponent().setTiles(tilemap);
player.GetComponent().setSprites(新精灵[]{northView、westView、eastView、southView});
}
无效更新()
{
如果(!isLocalPlayer)
{
返回;
}
if(Input.GetKey(KeyCode.W)){changeSprite(0);}
else if(Input.GetKey(KeyCode.A)){changeSprite(1);}
else if(Input.GetKey(KeyCode.D)){changeSprite(2);}
else if(Input.GetKey(KeyCode.S)){changeSprite(3);}
player.GetComponent().setTiles(tilemap);
}
[客户]
私有void changeSprite(int newDirection)
{
如果(newDirection==0){gameObject.GetComponent().newSprite(player,northView,0);}
else if(newDirection==1){gameObject.GetComponent().newSprite(player,westView,1);}
else if(newDirection==2){gameObject.GetComponent().newSprite(player,eastView,2);}
else if(newDirection==3){gameObject.GetComponent().newSprite(player,southView,3);}
}
}
PS!公共精灵链接到预制资源和精灵

ControlSprite.cs

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

public class ControlSprite : NetworkBehaviour
{
    private Sprite[] possibleSprites;

    [Command]
    void CmdProvideSpriteChangeToServer(GameObject entity, int newDirection)
    {
        entity.GetComponent<SpriteRenderer>().sprite = possibleSprites[newDirection];

        RpcSendSpriteChange(entity, newDirection);
    }

    [ClientRpc]
    void RpcSendSpriteChange(GameObject entity, int newDirection)
    {
        if (isLocalPlayer) return;

        entity.GetComponent<SpriteRenderer>().sprite = possibleSprites[newDirection];
    }

    public void newSprite(GameObject entity, Sprite newSprite, int newDirection)
    {
        entity.GetComponent<SpriteRenderer>().sprite = newSprite;
        CmdProvideSpriteChangeToServer(entity, newDirection);
    }

    public void setSprites(Sprite[] newSprites) { possibleSprites = newSprites; }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine。联网;
公共类ControlSprite:网络行为
{
私人精灵[]可能的仪式;
[命令]
void cmdProviderPriteChangeToServer(游戏对象实体,int newDirection)
{
entity.GetComponent().sprite=possibleSprites[newDirection];
RpcSendSpriteChange(实体,新方向);
}
[客户端RPC]
void RpcSendSpriteChange(游戏对象实体,int newDirection)
{
if(isLocalPlayer)返回;
entity.GetComponent().sprite=possibleSprites[newDirection];
}
public void newSprite(游戏对象实体、精灵newSprite、int newDirection)
{
entity.GetComponent().sprite=newSprite;
CmdProviderPriteChangeToServer(实体,新方向);
}
public void setprites(Sprite[]newSprites){possibleSprites=newSprites;}
}

结果显示,尝试玩游戏的人使用箭头键而不是WASD移动,但脚本仅在按下WASD键时更改精灵的方向。

您能显示更改精灵的代码吗?你可能会从某个文件夹中获取它们/下载它们等吗?添加了代码,但我不认为这会是个问题,因为.exe在创建者计算机上的工作方式应该是这样的。此外,我不会从文件夹特定的位置获取任何精灵,只使用预制件。当然,这很重要。。现在我们看到您正在使用一些网络,所以第一个问题是:您是否调用了网络上的方法?是的。本地主机在客户端计算机上工作,其他客户端在同一台计算机上工作。当sprite更改停止工作时,相同的.exe和生成文件夹中的所有伴随文件被分发。简言之,一切都按预期运行。为了在本地测试这一点,我只需要使用多个客户端并模拟LAN。听起来像是一个网络问题。。。