Месячный архив: Январь 2017

В каком разрешении рисовать спрайты для мобильной 2D игры?

Как известно, существует огромный парк мобильных устройств с различными разрешениями экранов и соотношениями сторон. И если вы читаете эту статью, то вам, как и мне, хочется определиться под какое же разрешение просить художника рисовать спрайты, да так, что бы на большинстве устройств игра выглядела хорошо.

Мы сразу отметём метод, согласно которому, игра рисуется под какой-то один формат, а для всех прочих масштабируется. Этот способ искажает картинку на экране и всё выглядит не так как задумывал художник.

Наш метод будет заключаться в том, что бы при разных соотношениях сторон отрезалась та часть изображения, которая не скажется ни на геймплее, ни на художественной композиции. Но какого размера должно быть исходное изображение фона?

Для этого определимся какие же разрешения экранов и соотношения сторон наиболее популярны на текущий момент. Я для этого воспользовался открытой статистикой от команды Unity, посмотреть её можно здесь. Вот данные актуальные на момент написания статьи:

Разрешения экранов

(далее…)

Отображение поля ScriptableObject в Custom Inspector’е некоторого компонента

Предположим, у нас есть некоторый класс унаследованный от MonoBehaviour, назовём его SODataBehaviour.

using UnityEngine;

namespace Triks.SO {
	public class SODataBehaviour : MonoBehaviour {

		/// <summary>
		/// Экземпляр класса SOData
		/// </summary>
		[SerializeField, Tooltip("Экземпляр класса SOData")]
		private SOData scriptableObjectData;

		/// <summary>
		/// Поле типа int
		/// </summary>
		[SerializeField, Tooltip("Поле типа int")]
		private int someInt = 5;
	}
}

В нём есть поле, тип которого — класс унаследованный от ScriptableObject, его мы назовём SOData.

using UnityEngine;

namespace Triks.SO {

	/// <summary>
    /// Класс характеризующий 
    /// </summary>
	[CreateAssetMenu(menuName = "Triks/SO Data")]
	public class SOData : ScriptableObject {
		
		/// <summary>
        /// Скорость передвижения
        /// </summary>
		[SerializeField, Range(1, 15), Tooltip("Скорость передвижения")]
		private float speed = 1;

		/// <summary>
        /// Возвращает скорость передвижения
        /// </summary>
		public float Speed { 
			get { return speed; }
		}

		/// <summary>
        /// Урон наносимый от контакта
        /// </summary>
		[SerializeField, Range(0.1f, 50), Tooltip("Урон наносимый от контакта")]
		private float contactDamage = 10;

		/// <summary>
        /// Возвращает урон наносимый от контакта
        /// </summary>
		public float ContactDamage {
			get { return contactDamage; }
		}
		
		/// <summary>
        /// Описание данных
        /// </summary>
		[SerializeField, Tooltip("Описание данных")]
		private string description;

		/// <summary>
        /// Возвращает описание данных
        /// </summary>
		public string Description {
			get { return description; }
		}
	}
}

По умолчанию в инспекторе это будет выглядеть так:

(далее…)

Debug.Log() и кто его вызвал

Порой, бывает удобно вывести в консоль отладки полный путь с иерархией в сцене того объекта, который это сообщение вызвал:

А вот как это можно сделать:

using UnityEngine;

public class Test : MonoBehaviour {

	public static string GetHierarchyPath(Component inComponent) {
		if (inComponent) {
			string path = inComponent.name;

			while (inComponent && inComponent.transform.parent) {
				inComponent = inComponent.transform.parent;
				path = inComponent.name + "/" + path;
			}
			return path;
		}	

		return string.Empty;
	}

	void Start () {
		Debug.Log("I am here -> " + GetHierarchyPath(this));				
	}
}