SnapToGrid — привязка объекта к сетке

Скипт автоматической привязки объектов(точнее префабов) в Unity сцене к определённой сетке. Очень удобно таким образом расставлять игровые штуки.


 

using UnityEngine;
using System.Collections;

//Привязка объекта к сетке в окне редактора
[ExecuteInEditMode]
public class SnapToGrid : MonoBehaviour 
{
  #if UNITY_EDITOR

  [Header("Привязка объекта к сетке")]
  public bool snapToGrid = true;
  [Header("Размер сетки")]
  public float snapValue = 0.32f;

  [Header("Брать размер сетки из SpriteRenderer")]
  public bool snapValueAuto = true;
  //********************************************************************************

  //*******************************************************************************
  void Update ()
  {
    
    if (snapToGrid)
    {
      if(snapValueAuto==true)
      {
        snapValue =gameObject.GetComponent<SpriteRenderer>().bounds.size.x;
      }

      Vector3 offset = Vector3.zero;

      transform.position = RoundTransform (transform.position , snapValue) + offset ;
    }
  }
  //**********************************************************************************************

  //**********************************************************************************************
  private Vector3 RoundTransform (Vector3 v, float snapValue)
  {
    return new Vector3
      (
        snapValue * Mathf.Round(v.x / snapValue - snapValue/2) + snapValue/2,
        snapValue * Mathf.Round(v.y / snapValue - snapValue/2) + snapValue/2,
        v.z
      );
  }
  //*************************************************************************************

  //******************************************************************************
  void OnDrawGizmosSelected()
  {			
    Vector3 start = new Vector3(transform.position.x - snapValue/2,transform.position.y + snapValue/2,transform.position.z);
    Gizmos.color = Color.yellow;
    //Gizmos.DrawSphere(start, 0.1f);

    float len = snapValue * 2;

    Gizmos.color = Color.gray;

    for (float i = len; i >= -(len); i -= snapValue) 
    {
      Gizmos.DrawLine (new Vector3 (start.x - len , start.y-i, start.z), new Vector3 (start.x + len, start.y-i, start.z));

      Gizmos.DrawLine (new Vector3 (start.x-i, start.y-len, start.z), new Vector3 (start.x - i , start.y + len, start.z));
    }
  }

  #endif
}

Скрипт вешается на префаб и с тех пор он начинает привязываться по заданой сетке.

© 2021 MidaDev.