#Unity3d问题为什么函数没有被调用?#

想实现的功能涉及了三个脚本,但是不知道为什么实现不了想要的功能,具体想实现的功能如下两图所示(由于发不了视频所以我就截取了两张图片),即有两层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屏数据线接触不良导致的。

  1. 您使用的万用表测试的数据显示,除D5之外的其他数据线接近0V,这说明这些数据线可能与LCD屏接触不稳定或者短路,导致无法正常传输数据信号。
  2. 您在P0与D0之间添加了上拉电阻,这说明在正常情况下,P0输出高电平时,D0也应该是高电平。但是测试结果显示D0接近0V,这也证明D0线路存在问题。
  3. 相同代码在开发板上可以正常工作,而在您的自定义板子上无法正常工作,这也提示是板子本身的原因,很有可能是LCD数据线路接触问题。
    综上,我的分析是您的板子上LCD数据线D0-D7存在接触不良或者短路的问题,导致无法正常传输数据,所以LCD显示异常。
    解决这个问题,我的建议是:
  4. 检查LCD数据线D0-D7与LCD屏的焊接情况,看是否存在明显的短路或开路。如果存在,需要重新焊接。
  5. 使用万用表在数据线两端测量电压,如果电压异常(略高于0V但远小于5V),说明接触不稳定,需要重焊。
  6. 检查数据线与其它线路或器件的距离,是否过近导致串扰干扰。必要时增加间距或加屏蔽。
  7. 如果上述方法仍无法解决,可以考虑换一个LCD屏测试,以确定问题的根源。
  8. 作为最后手段,您可以在程序中限制数据线D0-D7为低电平,仅使用D5传输数据,以测试LCD是否可以正常工作,这可以证明数据线问题的判断。
    希望上述分析和解决方法能帮助您修复LCD无法正常工作的问题。如有任何不理解或新问题的地方,请您继续提出,我会继续为您解答。祝顺利!

问题找到了是两层tilemap的rotation不一致导致的问题