Невозможно неявно преобразовать тип 'Coordinate_data' в 'RandomNumber' - PullRequest
0 голосов
/ 16 апреля 2020

Я хочу сохранить и загрузить данные из единицы, поэтому я следую, как сохранить атрибут объекта из https://www.youtube.com/watch?v=XOjd_qU2Ido, но когда я хочу вернуть данные для загрузки сохраненных данных, они могут неявно.

Здесь класс Coordinate_data

using UnityEngine;

[System.Serializable]

public class Coordinate_data
{
    public float[] position;

    public Coordinate_data (RandomNumber coordinate)
    {
        position = new float[3];
        position[0] = coordinate.transform.position.x;
        position[1] = coordinate.transform.position.y;
        position[2] = coordinate.transform.position.z;

    }
}

А здесь функция randomNumber предназначена для случайного выбора и отображения уже сохраненных или случайных данных

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class RandomNumber : MonoBehaviour
{
    public int MinNum = 0;
    public int MaxNum = 100;

    public Text NilaiRandomX = null;
    public Text NilaiRandomY = null;
    public Text NilaiRandomZ = null;

    public Vector3 position;

    public int StepTime = 2;

    void Start()
    {
        StartCoroutine(RandomNumGenerator());
    }

    IEnumerator RandomNumGenerator()
    {
        while (1 != 0)
        {
            yield return new WaitForSeconds(StepTime);
            int X = UnityEngine.Random.Range(MinNum, MaxNum);
            int Y = UnityEngine.Random.Range(MinNum, MaxNum);
            int Z = UnityEngine.Random.Range(MinNum, MaxNum);

            float nilaix = X;
            float nilaiy = Y;
            float nilaiz = Z;

            position = new Vector3(nilaix, nilaiy, nilaiz);
            transform.position = position;

            //NilaiRandomX.text = + X;
            NilaiRandomX.GetComponent<Text>().text = "" + X;
            //NilaiRandomY.text = Y;
            NilaiRandomY.GetComponent<Text>().text = "" + Y;
            //NilaiRandomZ.text = Z;
            NilaiRandomZ.GetComponent<Text>().text = "" + Z;

        }
    }
}

Здесь код для сохранить и загрузить данные

using UnityEngine;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

public static class SaveSystem
{
    public static void saveCoordinate (RandomNumber coordinate)
    {
        BinaryFormatter formatter = new BinaryFormatter();
        string path = Application.persistentDataPath + "coordinate.bin";
        FileStream stream = new FileStream(path, FileMode.Create);

        Coordinate_data data = new Coordinate_data(coordinate);

        formatter.Serialize(stream, data);

        stream.Close();
    }

    public static RandomNumber LoadPlayer()
    {
        string path = Application.persistentDataPath + "coordinate.bin";
        if (File.Exists(path))
        {
            BinaryFormatter formatter = new BinaryFormatter();
            FileStream stream = new FileStream(path, FileMode.Open);
            Coordinate_data data = formatter.Deserialize(stream) as Coordinate_data;
            stream.Close();

            return data; // fail to return data in here
        }
        else
        {
            Debug.LogError("Save File Not Found in " + path);
            return null;
        }
    }
}

Все работает нормально, за исключением того, что теперь я получаю это сообщение об ошибке "return person" в операторе if.

Невозможно неявно преобразовать тип 'Coordinate_data 'to' RandomNumber '

Кто-нибудь может помочь? Заранее спасибо.

1 Ответ

0 голосов
/ 16 апреля 2020

Поскольку вы объявили функцию для возврата RandomNumber!

В этой строке:

public static RandomNumber LoadPlayer() // This function is supposed to return RandomNumber
{
   ...
   Coordinate_data data = formatter.Deserialize(stream) as Coordinate_data;
   return data; // And returning Coordinate_data.
}

Похоже, вы новичок в C# или Unity, так что здесь про Совет: верьте тому, что говорит компилятор. Когда компилятор говорит Cannot implicitly convert type 'Coordinate_data' to 'RandomNumber', тогда должна быть ошибка, что вы используете тип Coordinate_data, где предполагается использовать RandomNumber.

Я не уверен, что это желаемое действие, но если вы хотите вернуть Coordinate_data, а затем просто изменить его тип возврата, например:

public static Coordinate_data LoadPlayer()

BTW, Implicit type conversion означает, что когда что-то не совпадает с , компилятор пытается интерпретировать его с помощью данный тип, например:

private void DoSomthingWithFloat(float x)
{
    ...
}

DoSomethingWithFloat(1);

В вышеприведенном примере параметр x должен быть float, но он вызывается со значением int. поэтому компилятор неявно преобразует его в float.

Но в вашем случае нет способа привести Coordinate_data к RandomNumber, поэтому компилятор выдал ошибку.

...