При создании приложения создается полностью работающий .exe или .app, который при идеальном запуске обладает всеми функциями и, что самое важное, корректно изменяет спрайты. Упомянутое изменение спрайта происходит, когда пользователь движется в разных направлениях, и скрипт соответствующим образом меняет спрайт на игроке GameObject. Все работает как положено в редакторе и в локальной сборке (.exe).
Проблема заключается в том, что когда папка сборки (включая .exe) отправляется на любой другой компьютер, спрайты перестают меняться. Отображается только основной спрайт, который использовался для визуализации GameObject.
Я попытался переключиться с отдельных файловых спрайтов на карту спрайтов, но это также не устранило проблему.
Самое странное, что все работает так, как и должно быть в каждой сборке на локальном компьютере и в редакторе, но никогда на любых других устройствах (ПК / 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); }
}
}
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; }
}