Ответы пользователя по тегу C#
  • Как сохранить словарь с префабами в текстовом документе?

    @NoNameDeveloper
    Unity Developer
    Ты можешь сохранять в ручную через BinaryWriter, BinaryReader или же Json. Сами префабы нельзя сохранять, а вот их данные можно.

    Вот тебе простая реализация как можно данные сохранить. (код я не проверил на работоспособность, но тем не менее)

    public interface IData
    {
    	void Read(BinaryReader reader);
    	void Write(BinaryWriter writer);
    }

    public class CustomClass : IData
    {
    	private int _customVar;
    
    	public void Write(BinaryWriter writer)
    	{
    		writer.Write(_customVar);
    	}
    
    	public void Read(BinaryReader reader)
    	{
    		_customVar = reader.ReadInt32();
    	}
    }

    public class PrefabClass: MonoBehaviour, IData
    {
    	private int _intValue;
    	private float _floatValue;
    	private string _stringValue;
    
    	private CustomClass _customClass;
    
    	public void Write(BinaryWriter writer)
    	{
    		writer.Write(_intValue);
    		writer.Write(_floatValue);
    		writer.Write(_stringValue);
    		((IData)_customClass).Write(writer);
    	}
    
    	public void Read(BinaryReader reader)
    	{
    		// Читать нужно в том же порядке что и пишется
    		_intValue = reader.ReadInt32();
    		_floatValue = reader.ReadSingle();
    		_stringValue = reader.ReadString();
    
    		// Свои данные
    		// ...
    		((IData)_customClass).Read(reader);
    	}
    }

    public class DictionaryClass
    {
    	private Dictionary<string, IData> _dict = new Dictionary<string, IData>();
    
    	public void Save()
    	{
    		using (BinaryWriter writer = new BinaryWriter(File.Open("Path", FileMode.Create)))
            {
                foreach(var item in _dict)
                {
                	item.Write(writer);
                }
            }
    	}
    
    	public void Load()
    	{
    		if (File.Exists("Path"))
            {
                using (BinaryReader reader = new BinaryReader(File.Open("Path", FileMode.Open)))
                {
                    foreach(var item in _dict)
                    {
                    	item.Read(reader);
                    }
                }
            }
    	}
    }
    Ответ написан
  • Как передать переменные с другого класса в скрипте?

    @NoNameDeveloper
    Unity Developer
    Рекомендую тебе открыть вот эту ссылку: https://docs.microsoft.com/en-us/dotnet/csharp/pro...
    И начать изучать C#, а то такие вопросы тут ни к чему.

    using UnityEngine;
    using UnityEngine.UI;
    
    public class NewBehaviourScript : MonoBehaviour
    {
        public Text Text;
    
        // Объявляешь поле типа 'Data'
        public Data SomeData;
    
        // Methods
    
        private void Awake()
        {
            // Создаешь экземпляр, иначе будет возвращать NULL.
            SomeData = new Data();
    
            // Используешь поля
            SomeData.field1 = 2;
            SomeData.field2 = false;
            SomeData.field3 = "release";
        }
    
        void Update()
        {
            Text.text = SomeData.field1 + "";
        }
    
        public void OnClick()
        {
            // Обращаешься к полю через созданного экземпляра типа 'Data'.
            SomeData.field1++;
        }
    
        
    
    }
    
    public class Data
    {
            public int field1 = 1;
            public bool field2 = true;
            public string field3 = "test";
    }
    Ответ написан
  • Как сделать объект, содержащий пары ключ-значение в Unity?

    @NoNameDeveloper
    Unity Developer
    Вариант 1: На сервере вы можете отправить JSON (обычный string) (В твоем случае не рекомендую). Но он будет весить по больше в зависимости конечно же от количество полей. В юнити есть JsonUtility который позволит вам работать с данным форматом. У вас должен быть класс только для данных

    public class Data {
      public int field1 = 1;
      public bool field2 = true;
      public string field3 = "test"
    }


    На выходе:
    {
      "field1": 1,
      "field2": true,
      "field3": "test"
    }


    Вариант 2: Вы можете использовать BinaryWriter/BinaryReader и отправить на сервере byte[]. Файлы будут весить меньше. Но сохранять и загружать значения будете в ручную:

    using UnityEngine;
    
    public class Data : MonoBehaviour
    {
        public int field1 = 1;
        public bool field2 = true;
        public string field3 = "test";
    
        // Methods
    
        public byte[] Save()
        {
        	MemoryStream stream = new MemoryStream();
            BinaryWriter writer = new BinaryWriter(stream);
    
            // В каком порядке записываются данные, в таком и нжно будет читать!
            writer.Write(field1); // int
            writer.Write(field2); // bool
            writer.Write(field3); // string
    
            // Output - byte[] который используется для отправки с помощью WWWForm.
            return stream.ToArray();
        }
    
        public void Load(byte[] data)
        {
            MemoryStream stream = new MemoryStream(data);
            using (BinaryReader reader = new BinaryReader(stream))
            {
                // Читаем данные.
                field1 = reader.ReadInt32();
                field2 = reader.ReadBoolean();
                field3 = reader.ReadString();
            }
        }
    }
    Ответ написан
  • Как при долгом зажатии менять силу длины и высоту прыжка?

    @NoNameDeveloper
    Unity Developer
    using UnityEngine;
    
    public class Jump : MonoBehaviour
    {
        private float _power;
    
        // Methods
    
        public void Update()
        {
        	// При нажатие сбрасываем силу прыжка.
            if(Input.GetKeyDown(KeyCode.Space))
            	_power = 1;
            
            // При зажатие увеличиваем силу на некое число.
            else if(Input.GetKey(KeyCode.Space))
           		_power += .1f;
    
            // При отпускании сделаем прыжок с полученной силой.
            // Направление только нужно будет дописать.
            else if(Input.GetKeyUp(KeyCode.Space))
            	rb.AddForce(_power, ForceMode2D.Impulse);
        }
    }
    Ответ написан
  • Как сделать сохранение для Web игры?

    @NoNameDeveloper
    Unity Developer
    Я не работал с WebGL, но вот что говорит ответ из интернета:

    Вы можете использовать PlayerPrefs, но размер файла PlayerPrefs в WebPlayer ограничен 1 МБ на URL, пользователя и компьютер...


    Если файл весит больше, то нужно сохранять на своем сервере и загружать оттуда же.
    Ответ написан
  • Не работает скрипт - калькулятор в юнити. Что делать?

    @NoNameDeveloper
    Unity Developer
    А вот и рабочий укороченный код. Конвертировать нужно не компонент InputField, а текст данного компонента.
    Можно использовать также int.Parse(value).

    using System;
    
    using UnityEngine;
    using UnityEngine.UI;
    
    public class SimpleCalculator : MonoBehaviour
    {
        [SerializeField] private InputField _firstInput;
        [SerializeField] private InputField _secondInput;
        [SerializeField] private InputField _signInput;
        [SerializeField] private Text _text;
    
        // Methods
    
        public void Calculator()
        {
            int a = int.Parse(_firstInput.text);
            int b = int.Parse(_secondInput.text);
    
            _text.text = GetResult(a, b).ToString();
        }
    
        private float GetResult(int a, int b)
        {
            switch(_signInput.text)
            {
                case "+": return Add(a, b);
                case "-": return Substract(a, b);
                case "*": return Multiply(a, b);
                case "/": return Divide(a, b);
                default: throw new Exception("Invalid sign");
            }
        }
    
        private float Add(int a, int b) => a + b;
        private float Substract(int a, int b) => a - b;
        private float Multiply(int a, int b) => a * b;
        private float Divide(int a, int b) => a / b;
    }
    Ответ написан
  • Как сделать диапазон для значений?

    @NoNameDeveloper
    Unity Developer
    Можно еще так использовать как вариант
    var yourValue = 5;
    var min = Mathf.Min(minValue, yourValue);
    var max = Mathf.Max(maxValue, yourValue);
    Ответ написан
  • Как зафиксировать камеру на вращающемся объекте?

    @NoNameDeveloper
    Unity Developer
    Ответил уже в комментариях к другому вопросу, но оставлю чтобы другим было понятно если столкнулись с этим.

    Камера не должна быть дочерным объекта который вращается.
    Настраивать вращение камеры в ручную, а дистанцию в инспекторе (offset)

    using UnityEngine;
    
    // Кинуть на камеру
    // Не забывать менять вращение самой камеры в ручную на сколько нужно.
    public class CameraFollow : MonoBehavior
    {
      // Соединить тут объект которого камера должна преследовать.
      [SerializedField] private Transform _target;
    
      // Дистанция между объекта и самой камеры.
      [SerializedField] private Vector3 _offset = new Vector3(0, -10, 0);
    
      // Насколько плавно камера будет следовать за объектом.
      [SerializedField] private float _smooth = .1f
    
      // Methods
    
      private void Update()
      {
        transform.position = Vector2.Lerp(transform.position, _target.transform.position + _offset, _smooth);
      }
    }
    Ответ написан