【问题标题】:Scripting with Raycast and hitObject (using C#)使用 Raycast 和 hitObject 编写脚本(使用 C#)
【发布时间】:2021-05-21 22:06:54
【问题描述】:

Unity 中的脚本错误。 C#初学者,我哪里错了?

这是错误:

Assets\Scripts\InteractHelper.cs(44,30): error CS0103: The name 'hitObject' does not exist in the current context

这是我的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InteractHelper : MonoBehaviour
{
    public Material MaterialInGaze;
    private Material _oldMaterial;
    private GameObject _objectInFocus;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        var ray = new Ray(Camera.main.transform.position,
            Camera.main.transform.forward);
        RaycastHit raycastInfo;

        if(Physics.Raycast(ray, out raycastInfo))
        {
            var hitObject = raycastInfo.transform.gameObject;
            if (hitObject == _objectInFocus)
                return;

            var renderer = hitObject.GetComponent<Renderer>();
            if (renderer == null)
                return;
            _oldMaterial = renderer.material;
            renderer.material = MaterialInGaze;
            _objectInFocus = hitObject;
        }
        else
        {
            if (_objectInFocus == null)
                return;

            var renderer = _objectInFocus.GetComponent<Renderer>();
            renderer.material = _oldMaterial;
            _objectInFocus = hitObject;
        }
    }
}

我正在关注一个教程(现在有点过时了),但我的代码与他们的完全匹配。 我只是在学习 C#

谢谢

【问题讨论】:

    标签: c# unity3d scripting hololens


    【解决方案1】:

    替换最后一行_objectInFocus = hitObject _objectInFocus = null

    【讨论】:

      【解决方案2】:

      错误发生在 else 语句的最后一行,就在这里:

              _objectInFocus = hitObject;
      

      发生此错误是因为在您的 if 语句中声明了 hitObject,而此代码在您的 else 语句中;由于它们位于代码的不同部分,因此无法判断 hitObject 已被声明。

      最好的解决办法是在 if 语句之前声明 hitObject。

      例如,新代码将是

          ... 
      
          RaycastHit raycastInfo;
      
          var hitObject = raycastInfo.transform.gameObject;
      
          if(Physics.Raycast(ray, out raycastInfo))
          {
      
          ... 
      

      而不是将 hitObject 放在同一区域。总是将其声明为 null 会导致不需要的行为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-02
        • 1970-01-01
        • 2016-09-04
        • 2011-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多