Почему сохранение масштаба 3D-объекта с помощью PlayerPrefs превращает его в черную 2D-форму? - PullRequest
0 голосов
/ 16 января 2019

Я был в процессе отладки своего кода и понял, что по какой-то причине сохранение масштаба 3D-объекта с помощью PlayerPrefs, а затем загрузка его обратно приводит к тому, что объект превращается в черную 2D-форму (поэтому вместо куба) становится черным квадратом). Все остальное работает нормально (сохранение / загрузка позиции и вращение), но как только я ввожу код для сохранения / загрузки шкалы, появляется черная 2D-форма. Что может быть причиной этого?

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

public class cubeControls : MonoBehaviour
{
    // Constants for object rotation
    public float moveSpeed = 80.0F;
    public float turnSpeed = 100.0F;

    // Initial scale of the original cube
    public static Vector3 initscale = Vector3.one;

    // Start is called before the first frame update
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
        /* Changing the position of the object
         * 
         */

        // Reset the position to original
        if (Input.GetKey(KeyCode.Alpha0))
        {
            transform.position = Vector3.zero;
        }

        // Moving the object right
        if (Input.GetKey(KeyCode.D))
        {
            transform.Translate(Vector3.right * moveSpeed * Time.deltaTime);
        }

        // Moving the object left
        if (Input.GetKey(KeyCode.A))
        {
            transform.Translate(Vector3.left * moveSpeed * Time.deltaTime);
        }

        // Moving the object forwards
        if (Input.GetKey(KeyCode.W))
        {
            transform.Translate(Vector3.back * moveSpeed * Time.deltaTime);
        }

        // Moving the object backwards
        if (Input.GetKey(KeyCode.S))
        {
            transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
        }

        // Moving the object up
        if (Input.GetKey(KeyCode.F))
        {
            transform.Translate(Vector3.up * moveSpeed * Time.deltaTime);
        }

        // Moving the object down
        if (Input.GetKey(KeyCode.V))
        {
            transform.Translate(Vector3.down * moveSpeed * Time.deltaTime);
        }

        /* Changing the rotation of the object
        * 
        */

        // Reset the rotation to original by returning a rotation at (0, 0, 0)
        if (Input.GetKey(KeyCode.Alpha0))
        {
            transform.rotation = Quaternion.Euler(Vector3.zero);
        }

        // Rotating the cube to the right
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.Rotate(Vector3.up, turnSpeed * Time.deltaTime);
        }

        // Rotating the cube to the left
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.Rotate(Vector3.down, turnSpeed * Time.deltaTime);
        }

        // Rotating the cube in an upwards motion
        if (Input.GetKey(KeyCode.UpArrow))
        {
            transform.Rotate(Vector3.right, turnSpeed * Time.deltaTime);
        }

        // Rotating the cube in a downwards motion
        if (Input.GetKey(KeyCode.DownArrow))
        {
            transform.Rotate(Vector3.left, turnSpeed * Time.deltaTime);
        }

        /* Changing the scale of the object
        * 
        */

        // Reset the cube to the original scaled size
        if (Input.GetKeyDown(KeyCode.Alpha0))
        {
            transform.localScale = initscale;
        }

        // Double the size of the cube
        if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            transform.localScale += new Vector3(2F, 2F, 2F);
        }
    }

    // To add button elements to the visual interface
    void OnGUI()
    {
        // Saving
        if (GUI.Button(new Rect(700, 330, 50, 30), "Save"))
        {
            // Saving the object's position 
            PlayerPrefs.SetFloat("xCoord", transform.position.x);
            PlayerPrefs.SetFloat("yCoord", transform.position.y);
            PlayerPrefs.SetFloat("zCoord", transform.position.z);
            transform.position = Vector3.zero;

            // Saving the object's rotation 
            PlayerPrefs.SetFloat("xRot", transform.rotation.eulerAngles.x);
            PlayerPrefs.SetFloat("yRot", transform.rotation.eulerAngles.y);
            PlayerPrefs.SetFloat("zRot", transform.rotation.eulerAngles.z);
            transform.rotation = Quaternion.Euler(Vector3.zero);

            // Saving the object's scale 
            PlayerPrefs.SetFloat("xScale", transform.localScale.x);
            PlayerPrefs.SetFloat("yScale", transform.localScale.y);
            PlayerPrefs.SetFloat("zscale", transform.localScale.z);
            transform.localScale = initscale;
        }

        // Loading
        if (GUI.Button(new Rect(770, 330, 50, 30), "Load"))
        {
            transform.position = new Vector3(PlayerPrefs.GetFloat("xCoord"), PlayerPrefs.GetFloat("yCoord"), PlayerPrefs.GetFloat("zCoord"));
            transform.rotation = Quaternion.Euler(PlayerPrefs.GetFloat("xRot"), PlayerPrefs.GetFloat("yRot"), PlayerPrefs.GetFloat("zRot"));
            transform.localScale = new Vector3(PlayerPrefs.GetFloat("xScale"), PlayerPrefs.GetFloat("yScale"), PlayerPrefs.GetFloat("zScale"));
        }
    }
}

Вот что я вижу на своем экране: Это масштабированный объект, который я хочу сохранить. enter image description here

Это то, что я вижу на своем экране после нажатия «Сохранить» и «Загрузить». enter image description here

Кроме того, я только что попытался вставить несколько сообщений Debug.Log, чтобы увидеть, если что-то не так, и похоже, что zScale загружается как 0, хотя на этапе сохранения используется правильное значение.

1 Ответ

0 голосов
/ 16 января 2019

Это экземпляр без zScale. Посмотрите, как вы сохраняете его с именем «zscale», но пытаетесь загрузить его с помощью «zScale». Капитализация важна!

...