#unity3d问题 #

有两层tilemap,一层是铺好的地面,另一层MarkerTilemap是空的,我看视频中只是把Marker(即下图中的白块)拖到了Tile Palette上,也没有铺到MarkerTilemap上,但是视频中最终实现了下两图的功能(由于不能发视频,我就截取了两张图片),就是随着鼠标移动会在相应位置出显示出白块,但是鼠标移开后会恢复原状

img

img


脚本并没有报错,我在排查问题时在TileMapReadController脚本中一个函数中加入一行Debug.Log("111"); 但是游戏运行时发现Console中没有111输出,所以我估计就是这里出了问题,但是为什么呢?具体位置在下面第一个图public TileBase GetTileBase(Vector3Int gridPosition)中;有关实现这个功能的三个脚本在下面给出,请你帮我看看是哪里有问题

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不一致带来的问题

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632