有两层tilemap,一层是铺好的地面,另一层MarkerTilemap是空的,我看视频中只是把Marker(即下图中的白块)拖到了Tile Palette上,也没有铺到MarkerTilemap上,但是视频中最终实现了下两图的功能(由于不能发视频,我就截取了两张图片),就是随着鼠标移动会在相应位置出显示出白块,但是鼠标移开后会恢复原状
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;
public class TileMapReadController : MonoBehaviour
{
[SerializeField] Tilemap tilemap;
[SerializeField] List tileDatas;
Dictionary dataFromTiles;
public void Start()
{
dataFromTiles = new Dictionary();
foreach (TileData tileData in tileDatas)
{
foreach(TileBase tile in tileData.tiles)
{
dataFromTiles.Add(tile, tileData);
}
}
}
Vector3 worldPosition;
public Vector3Int GetGridPosition(Vector3 position, bool mousePosition)
{
Ray ray = Camera.main.ScreenPointToRay(position);
if (Physics.Raycast(ray, out RaycastHit hit))
{
worldPosition = hit.point;
}
else
{
worldPosition = Camera.main.transform.position + ray.direction * 100.0f;
}
//Debug.Log(worldPosition);
Vector3Int gridPosition = tilemap.WorldToCell(worldPosition);
//Debug.Log(gridPosition);
return gridPosition;
}
public TileBase GetTileBase(Vector3Int gridPosition)
{
TileBase tile = tilemap.GetTile(gridPosition);
//Debug.Log("111");
return tile;//此处代码有问题因为根本没有return出来东西
}
public TileData GetTileData(TileBase tilebase)
{
return dataFromTiles[tilebase];
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ToolsCharacterController : MonoBehaviour
{
CharacterController2D character;
Rigidbody rgbd2d;
[SerializeField] float offsetDistance = 1f;
[SerializeField] float sizeOfInteractableArea = 1.2f;
[SerializeField] MarkerManager markerManager;
[SerializeField] TileMapReadController tileMapReadController;
private void Awake()
{
character = GetComponent();
rgbd2d = GetComponent();
}
public void Update()
{
Marker();
if(Input.GetMouseButtonDown(0))
{
UseTool();
}
}
private void Marker()
{
Vector3Int gridPosition = tileMapReadController.GetGridPosition(Input.mousePosition, true);
markerManager.markedCellPosition = gridPosition;
}
public void UseTool()
{
Vector3 position = rgbd2d.position + character.lastMoveVector * offsetDistance;
Collider[]colliders = Physics.OverlapSphere(position,sizeOfInteractableArea);
foreach(Collider c in colliders)
{
ToolHit hit = c.GetComponent();
if (hit != null)
{
hit.Hit();
break;
}
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;
public class MarkerManager : MonoBehaviour
{
[SerializeField] Tilemap targetTilemap;
[SerializeField] TileBase tile;
public Vector3Int markedCellPosition;
public Vector3Int oldCellPosition;
private void Update() {
targetTilemap.SetTile(oldCellPosition, null);
targetTilemap.SetTile(markedCellPosition, tile);
oldCellPosition = markedCellPosition;
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话:问题找到了是两层tilemap的rotation不一致带来的问题
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!