想实现的功能涉及了三个脚本,但是不知道为什么实现不了想要的功能,具体想实现的功能如下两图所示(由于发不了视频所以我就截取了两张图片),即有两层tilemap,一层是铺好的地面,另一层MarkerTilemap是空的,我看视频中只是把Marker(即下图中的白块)拖到了Tile Palette上,也没有铺到MarkerTilemap上,游戏开始运行后随着鼠标移动会在相应位置出显示出白块,但是鼠标移开后会恢复为原来的地面。我在排查问题时在TileMapReadController脚本中即下图中第一个代码块第42行和第48行加入一行Debug.Log("111"); 但是游戏运行时发现Console中没有111输出,看来是这两个函数并没有被调用,并且已知worldPosition和gridPosition的值都是正常的(即第一个代码块的33行和35行),所以问题到底出在哪里呢?
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;
}
}
根据您的描述,这很有可能是LCD屏数据线接触不良导致的。
问题找到了是两层tilemap的rotation不一致导致的问题