Ответы пользователя по тегу Unity
  • Как прорисовывать местоположения точек на сцене?

    @NoNameDeveloper
    Unity Developer
    OnDrawGizmos - Документация в помощь

    using UnityEngine;
    using System.Collections;
    
    public class ExampleClass : MonoBehaviour
    {
        public Vector3[] Points;
        [SerializedField] private float _sphereRadius = 1;
        [SerializedField] private float _sphereColor = new Color32(0, 150, 255, 255);
    
        // Methods
    
        private void OnDrawGizmos()
        {
            Gizmos.color = _sphereColor;
    
            for(int i = 0; i < Points.Length; i++)
            {
                // Draw a yellow sphere at the transform's position.
                Gizmos.DrawSphere(Points[i], _sphereRadius);
                Handles.Label(Points[i], $"Point {i}");
            }
        }
    }
    Ответ написан
    Комментировать
  • Как мне изменить цвет 3d обьекта в анимации?

    @NoNameDeveloper
    Unity Developer
    У материала должно быть поле _Color.
    Создешь скрипт который будет менять значение цвета через "material.SetColor()" (если не ошибаюсь).
    public class MyCode 
    {
    	[SerializedField] private Color _color = Color.red;
    
    	// Соединяешь материал что используется в MeshRenderer (из ресурсы).
    	[SerializedField] private Material _mat; 
    
    	public void TakeDamage()
    	{
    		// ...
    		// блаблабла
    		// ...
    
    		StartCoroutine(ChangeColor());
    	}
    
    	private IEnumerator ChangeColor()
    	{
    		float speed = 5;
    
    		// Изменение с белого на красный
    		for(float t = 0; t < 1; t += Time.deltaTime * speed)
    		{
    			_mat.SetColor("_Color",  Color.Lerp(Color.white, _color, t));
    			yield return null;
    		}
    
    		// И обратно.
    		for(float t = 0; t < 1; t += Time.deltaTime * speed)
    		{
    			_mat.SetColor("_Color",  Color.Lerp(_color, Color.white, t));
    			yield return null;
    		}
    	}
    }
    Ответ написан
  • Как перезапустить уровень при вылете игрока с карты?

    @NoNameDeveloper
    Unity Developer
    Перед тем как задать свой вопрос, нужно приложить усилия и искать ответ, потому что такие глупые вопросы ты не один задаешь, не в первый раз. На них уже есть разные ответы, на вкус, на другие языки. Задавай на русском, задавай на английском, почитай документацию. Я не буду тебе писать код, вот держи ссылки на которых есть ответы, собирай свой конструктор сам.

    https://docs.unity3d.com/ScriptReference/Transform...
    https://www.reddit.com/r/Unity3D/comments/brsqr6/d...
    https://docs.unity3d.com/ScriptReference/SceneMana...
    Ответ написан
    3 комментария
  • Как сохранить словарь с префабами в текстовом документе?

    @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);
                    }
                }
            }
    	}
    }
    Ответ написан
    Комментировать
  • Как сделать ветку развития у ScriptableObjects?

    @NoNameDeveloper
    Unity Developer
    Для этого нужно создать касомной инспектор используя класс Editor из пространства имен UnityEditor.
    У них пример даже есть в документации есть:
    https://docs.unity3d.com/ScriptReference/EditorGUI...
    Ответ написан
    Комментировать
  • Как остановить объект на определенном расстоянии от другого объекта?

    @NoNameDeveloper
    Unity Developer
    if(Vector3.Distance(current.position, target.position) < 30)
    {
        Destroy(target.gameObject);
    }
    Ответ написан
    Комментировать
  • OnMouseDown работает не правильно?

    @NoNameDeveloper
    Unity Developer
    OnMouseDown работает только с UI
    Ответ написан
    Комментировать
  • Как создать ресурс в unity3d (Resources.Save())?

    @NoNameDeveloper
    Unity Developer
    В рантайме нельзя сохранять файлы в resources. Можно сохранять в temporaryCache, persistentDataPath и загрузить уже оттуда.

    Нужно использовать библиотеку System.IO и эти 2 метода File.WriteAllBytes, File.ReadAllBytes.
    Ответ написан
    Комментировать
  • Как сделать + x + 5 в юнити?

    @NoNameDeveloper
    Unity Developer
    transform.position = new Vector3(pos.transform.position.x + 5, pos.transform.position.y, pos.transform.position.z);
    Ответ написан
    Комментировать
  • Как передать переменные с другого класса в скрипте?

    @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";
    }
    Ответ написан
    Комментировать
  • Как сделать анимацию подбора объекта относительно героя?

    @NoNameDeveloper
    Unity Developer
    Никогда не нужно анимировать позицию объекта если ее нужно будет менять из других мест.


    У тебя есть текущий объект, допустим MyObject. На нем есть скрипты, аниматор, события. Тебе нужно чтобы этот объект имел разные позиции, это значит что в анимации ты не должен затрагивать позицию данного объекта.
    Поэтому тебе нужно создать дочерный объект у которого и будет анимироваться позиция.

    - MyObject (Scripts, Animator, Events, others) - ему указываешь позицию где создаваться
    -- ChildObject - позиция текущего меняется через аниматор

    Таким образом, ChildObject будет анимироваться относительно MyObject.
    Ответ написан
  • Как сделать объект, содержащий пары ключ-значение в 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();
            }
        }
    }
    Ответ написан
    3 комментария
  • Как тут обойтись без статичных методов?

    @NoNameDeveloper
    Unity Developer
    MVC
    (Model) Component и его наследники. Используешь ТОЛЬКО для данных (ex: имя, цена, спрайт)
    (View) У тебя должен быть префаб (ComponentView (как пример)) который принимает Model (Component) и заполнять текста и картинки с текстом и спрайтами из Model.
    (Controller) Через него ты должен заполнять Views с Models.

    Простой пример:
    public class ComponentModel
    {
        public string Name;
    }
    
    public class ComponentView
    {
        private Text _nameTxt;
    
        public void Set(ComponentModel model)
        {
            _nameTxt.text = model.Name;
        }
    }
    
    public class ComponentController
    {
        private List<ComponentModel> _components;
        public Transform Parent;
        public ComponentView ComponentPrefab;
    
        // Methods
    
        public void Awake()
        {
            Fill();
        }
    
        public void Fill()
        {
            for(int i = 0; i < _components.Count; i++)
            {
                ComponentView view = Instantiate(ComponentPrefab, parent);
                view.Set(_components[i]);
            }
        }
    }
    Ответ написан
    Комментировать
  • Как при долгом зажатии менять силу длины и высоту прыжка?

    @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);
        }
    }
    Ответ написан
    1 комментарий
  • Как сделать сохранение для Web игры?

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

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


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

    @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;
    }
    Ответ написан
    3 комментария
  • Как избавится от накладки в Scroll View?

    @NoNameDeveloper
    Unity Developer
    https://docs.unity3d.com/2017.3/Documentation/Scri...

    - Если не срабатывает с первого раза layout(grid,vertical,horizontal) group, то нужно перестроить объект на котором и лежит компонент layout group.
    - Этот метод нужно вызывать после включения.
    LayoutRebuilder.ForceRebuildLayoutImmediate(scrollView.content);

    Или если это не поможет, то можно воспользоваться IEnumerator'ом:

    private IEnumerator AfterActivate()
    {
        yield return null;
        LayoutRebuilder.ForceRebuildLayoutImmediate(scrollView.content);
    }
    Ответ написан
    1 комментарий
  • Как сделать диапазон для значений?

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

    @NoNameDeveloper
    Unity Developer
    Не нужно использовать в таком случае аниматор, а сам писать скрипт для этого используя Quaternion.Lerp
    Ответ написан
    Комментировать
  • Как зафиксировать камеру на вращающемся объекте?

    @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);
      }
    }
    Ответ написан
    Комментировать