Спрайты корректно меняются в сборке на компьютере-создателе, но не на других устройствах - PullRequest
0 голосов
/ 21 июня 2019

При создании приложения создается полностью работающий .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; }
}

Player Prefab

1 Ответ

0 голосов
/ 22 июня 2019

Оказывается, что люди, которые пытались играть в игру, использовали для перемещения клавиши со стрелками вместо WASD, но сценарий изменяет направление спрайта только при нажатии клавиш WASD.

...