首页 > 解决方案 > Unity 2020 - 2D 游戏,在使用 Raycast 时出现我的对象无法设置为对象实例的错误

问题描述

我目前正在 Unity 上开发一款基于网格运动的 2D 游戏。我遇到了光线投射系统的问题(我打算用它来检测玩家移动到的瓷砖中的内容)。

我的整个播放器代码在所有组之间拆分,这些组都连接到称为“playerScript”的父脚本。

我从两个脚本“PlayerCollisionScript”和“PlayerMovementScript”中得到错误 PlayerCollisionScript看起来像这样

using UnityEngine;
public class PlayerCollisionScript : MonoBehaviour
{
    [SerializeField]
    internal PlayerScript playerScript;

    internal void IfPlayerWalkWall()
    {
        RaycastHit2D hit = Physics2D.Raycast(transform.position, transform.TransformDirection(playerScript.direction), 1f);
        if (hit.collider.name == "Walls")
        {
            Debug.Log("Walk wall");
        }
    }

}

PlayerMovementScript

using System.Collections;
using UnityEngine;

public class PlayerMovementScript : MonoBehaviour
{
    [SerializeField]
    internal PlayerScript playerScript;

    private void Update()
    {
        // What happens when the player moves
        if ((playerScript.moveUp == true) && !playerScript.isPlayerMoving)
        {
            playerScript.direction = Vector2.up;
            playerScript.collisionScript.IfPlayerWalkWall();
            if (playerScript.hitWall == false)
            {
                StartCoroutine(MovePlayer(playerScript.direction));
            }
            playerScript.hitWall = false;
        }
    }

我一直在下车错误错误图片

到目前为止,我已经尝试将整个 Raycast 代码移动到 MovementScript 中,但我仍然遇到相同的错误,只要我在 CollisionScript 中键入某些内容就会发生hit此错误,例如hit.collider.name会收到此错误,hit它本身就可以正常工作。

谢谢愿意帮忙的人^^

标签: unity3d

解决方案


请参考API

“这个函数返回一个 RaycastHit2D 对象,其中引用了被射线击中的对撞机(如果没有击中,结果的对撞机属性将为 NULL)。”

尤其是由于您将光线投射的最大距离限制为1单位,因此它不太可能不会击中任何东西。

您的脚本应该在尝试访问之前进行检查hit.collider.name

RaycastHit2D hit = Physics2D.Raycast(transform.position, transform.TransformDirection(playerScript.direction), 1f);   
if (hit.collider && hit.collider.name.Equals("Walls"))
{
    Debug.Log("Walk wall");
}

推荐阅读