События мыши для Unity3D изометрической карты тайлов - PullRequest
0 голосов
/ 25 января 2019

Я читал о новой системе карт тайлов в Unity3D.Мне удалось добраться до точки настройки сетки -> плитка-карта и настройки палитры плиток.Однако сейчас я борюсь с поиском современных учебных пособий для обработки событий мыши для этой новой системы карт листов.

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

Существуют ли хорошие современные учебные пособия для обработки событий мыши на изометрической карте тайлов?Даже простой учебник, показывающий эффект наведения на плитку и «привет мир из плитки xy» при нажатии на плитку, - это все, что мне действительно нужно для начала работы.

Это то, что я имею до сих пор:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MouseManager : MonoBehaviour
{
    void Update()
    {
        Vector3 clickPosition = Vector3.one;
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if(Physics.Raycast(ray, out hit))
        {
            clickPosition = hit.point;
        }
        Debug.Log(clickPosition);
    }
}

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Это немного другая версия, чем HumanWrites.Он не требует ссылки на сетку, и mousePos объявлен как Vector2, а не Vector3;это позволит избежать проблем при работе в 2D.

using UnityEngine;
using UnityEngine.Tilemaps;

public class MouseManager : MonoBehaviour
{

private Tilemap tilemap;

void Start()
{
    //You can serialize this and assign it in the editor instead
    tilemap = GameObject.Find("Tilemap").GetComponent<Tilemap>();
}

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        Vector3Int gridPos = tilemap.WorldToCell(mousePos);

        if (tilemap.HasTile(gridPos))
            Debug.Log("Hello World from " + gridPos);
    }
}

}

«Карта тайлов», на которую мы ссылаемся, является игровым объектом в вашей сцене.Возможно, вы переименовали его во что-то другое, но это будет потомок объекта Grid.enter image description here

0 голосов
/ 25 января 2019

Это должно помочь вам начать:

using UnityEngine;
using UnityEngine.Tilemaps;

public class test : MonoBehaviour {

   //You need references to to the Grid and the Tilemap
   Tilemap tm;
   Grid gd;

   void Start() {
       //This is probably not the best way to get references to
       //these objects but it works for this example
       gd = FindObjectOfType<Grid>();
       tm = FindObjectOfType<Tilemap>();
   }

   void Update() {

       if (Input.GetMouseButtonDown(0)) {
           Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
           Vector3Int posInt = gd.LocalToCell(pos);

           //Shows the cell reference for the grid
           Debug.Log(posInt);

           Debug.Log(tm.GetTile(posInt).name);
       }
   }
}

Короче, получите ссылку на сетку и карту тайлов. Найдите локальные координаты, используя ScreenToWorldPoint (Input.mousePosition). Вызовите метод LocalToCell объекта grid, чтобы преобразовать ваши локальные координаты (Vector3) в координаты ячейки (Vector3Int). Передайте шнуры ячеек в метод GetTile объекта Tilemap, чтобы получить Tile (затем используйте методы, связанные с классом Tile, чтобы внести любые необходимые изменения).

В этом примере я только что прикрепил вышеуказанный скрипт к пустому игровому объекту в мире. Вместо этого, вероятно, имеет смысл присоединить его к Решетке. Общая логика остается тем не менее.

...