Как сделать 2d Sprite или Оптимизируем 2д Игры

При создании 2д игры мы выставляем проекцию камеры в ортографическую, чтобы вся «объемность» объектов усекалась.

После этого вешаем текстуры на кубы/плоскости, выставляем нужную позицию и размеры и радуемся. Но! Есть одно Но! Нам приходится ворочать либо камеру, либо сам объект чтобы текстура ровно отображалась(т.е. не вверх ногами) и при этой на наш объект уходит 8 вершин(в случае с кубом) и больше для плоскости.

Подумав над всем этим, я решил упростить себе(и вам) жизнь, и написать простенький скрипт, который пересоздаст Меш(т.е. теперь у нас будет 4 вершины) и отобразит текстуру как нам хотелось бы. Что для этого делаем? Смотрим под кат…

Нам нужен всего-лишь один класс… Создаем скрипт C#, называем Sprite2d и вносим туда код:

///Sprite2d by afrokick(devby.ru)
///Класс для 2d GUI, 2d GameObject
///Создает плоскость, состоящую из 4 вершин и 2 треугольников. Normal направлена против оси Z(смотрит на камеру).
///Отключает Recv и Cast Shadows
using UnityEngine;
[ExecuteInEditMode]
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class Sprite2d : MonoBehaviour
{
    private static Mesh m = null;
    /// <summary>
    /// Создает меш
    /// </summary>
    private static void CreateMesh()
    {
        if (m != null)
            return;
        float size = 0.5f;
        m = new Mesh();
        m.name = "Mesh2d";

        m.vertices = new Vector3[]{
            
            new Vector3(-size, size, 0),
            new Vector3(-size, -size, 0),
            new Vector3(size, -size, 0),
            new Vector3(size, size, 0)
            
        };

        m.uv = new Vector2[]{
            new Vector2 (0, 1),
            new Vector2 (0, 0),
            new Vector2 (1, 0),
            new Vector2(1, 1)
            
        };
        int[] triangles = new int[] { 0, 1, 2, 0, 2, 3 };

        for (int i = 0; i < triangles.Length; i += 3)
        {

            int temp = triangles[i + 1];

            triangles[i + 1] = triangles[i + 2];

            triangles[i + 2] = temp;

        }
        m.triangles = triangles;
        m.RecalculateNormals();
    }

    void SetMesh()
    {
        CreateMesh();
        GetComponent<MeshFilter>().mesh = m;
        var mr = GetComponent<MeshRenderer>();
        mr.castShadows = false;
        mr.receiveShadows = false;
    }

    void Awake()
    {
        SetMesh();
        Debug.Log("Sprite2d:Awake()");
    }
}



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

Как работает? Создаем Куб, бросаем на него этот скрипт, добавляем текстуру на куб и все, радуемся жизни.

PS Для того, чтобы размеры, которые вы задаете объекту(кубу) с помощью Scale совпадали с экранными размерами, нужно в свойстве Size камеры установить значение половины высоты игры. Т.е. если у вас игра 640х480, где 480 — высота, то Size = 480/2 = 240

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.