Я был в процессе отладки своего кода и понял, что по какой-то причине сохранение масштаба 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"));
}
}
}
Вот что я вижу на своем экране:
Это масштабированный объект, который я хочу сохранить.
Это то, что я вижу на своем экране после нажатия «Сохранить» и «Загрузить».
Кроме того, я только что попытался вставить несколько сообщений Debug.Log, чтобы увидеть, если что-то не так, и похоже, что zScale загружается как 0, хотя на этапе сохранения используется правильное значение.