首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >统一-为什么脚本的getcomponent在场景中将脚本附加到游戏对象时返回null

统一-为什么脚本的getcomponent在场景中将脚本附加到游戏对象时返回null
EN

Stack Overflow用户
提问于 2021-05-30 23:20:48
回答 2查看 973关注 0票数 0

我创建了一个TileMap。我的敌人是一个带有"EnemyMover.cs“脚本的简单圆柱体,在按下游戏之前,它就在场景(等级)中。(运行时未实例化)

在一个单独的对象上,我有一个"TargetLocator“脚本,它试图利用GetComponent在运行时通过单击地图上的平铺来实例化柱面脚本组件。

代码语言:javascript
复制
    public class TargetLocator : MonoBehaviour
{
    [SerializeField] private Transform weapon;
    private Transform target;
    
    void Start()
    {
        target = GetComponent<EnemyMover>().transform;
    }
    
    void Update()
    {
        AimWeapon();
    }

    void AimWeapon()
    {
        weapon.LookAt(target);
    }
}

错误:

NullReferenceException:对象引用没有设置为对象TargetLocator.Start ()的实例(在资产/塔/TargetLocator.cs:12处)

我应该指出,我试图:

  1. 重置统一
  2. ,移除转换和验证对象
  3. 添加刚体到敌人(圆柱)
  4. 添加对撞机

G 211

除刚体外,它们仍然返回空值,但这会导致物品从地板上掉下来,并且仍然不会瞄准敌人。

代码语言:javascript
复制
    public class EnemyMover : MonoBehaviour
    {
        [SerializeField] private List<Waypoint> path = new List<Waypoint>();
        [SerializeField] [Range(0f, 5f)] private float speed = 1f;
    
        void Start()
        {
            StartCoroutine(FollowPath());
        }
    
        IEnumerator FollowPath()
        {
            foreach (Waypoint waypoint in path)
            {
                Vector3 startPos = transform.position;
                Vector3 endPos = waypoint.transform.position;
                float travelPercent = 0f;
                
                // todo reintroduce when object can face
                // transform.LookAt(endPos);
    
                while (travelPercent < 1f)
                {
                    travelPercent += Time.deltaTime * speed;
                    transform.position = Vector3.Lerp(startPos, endPos, travelPercent);
                    yield return new WaitForEndOfFrame();
                }
            }
        }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-30 23:26:12

不要使用transform (它是对象的真实位置),而是尝试调用该脚本中的方法。例如EnemyMover

代码语言:javascript
复制
 public class EnemyMover: MonoBehaviour
{
    private Transform target;
    
    public Transform CalculateTarget()
    {
        target = GetComponent<Player>().transform;
        return target;
    }
}

然后在TargetLocator中,您可以调用:

代码语言:javascript
复制
target = GetComponent<EnemyMover>().CalculateTarget();
票数 0
EN

Stack Overflow用户

发布于 2021-05-31 04:53:36

它看起来不像TargetLocator附加到--与EnemyMover相同的 GameObject

你说你自己

在一个单独的对象上,我有一个"TargetLocator“脚本,它试图利用GetComponent在运行时通过单击地图上的一个平铺来实例化柱面脚本组件。

Component.GetComponent在给定的Component (从它继承的MonoBehaviour)实例上查找组件。在您的例子中,this ->是TargetLocator本身的引用。

您更希望使用例如FindObjectOfType,它在场景层次结构中的任何对象上查找给定类型的组件。

代码语言:javascript
复制
target = FindObjectOfType<EnemyMover>().transform;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67766505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档