【问题标题】:can i move a gameObject based on just its name?我可以仅根据名称移动游戏对象吗?
【发布时间】:2021-12-18 12:05:52
【问题描述】:

我正在使用光线投射,将其RaycastHit 放入名为raycastHit 的变量中,使用它来获取raycastHit.transform.name,然后我可以使用gameObject 名称中的信息来移动其位置吗?或者如果没有,我可以从raycastHit 获取信息来直接移动它吗? (在光线投射功能之外)我已经在寻找答案,但我只找到关于如何移动任何gameObject 的结果。

编辑1: 我当前版本的 void:

public RaycastHit raycastHit;
    private void HandleHookShotStart()
    {
        
        if (TestInputDownHookShot())
        {
            int gm = LayerMask.NameToLayer("Ground");
            int lwm = LayerMask.NameToLayer("LightWeight");
            int layers = 1 << gm | 1 << lwm;
            if (Physics.Raycast(Shoulder.transform.position, cam.transform.forward, out raycastHit, float.PositiveInfinity, layers))
            {
                //Hit Something
                debugHitpointTransform.position = raycastHit.point;
                hookshotPosition = raycastHit.point;
                hookShotSize = 0f;
                HookShotTransform.gameObject.SetActive(true);
                HookShotTransform.localScale = Vector3.zero;

                if (raycastHit.collider.gameObject.layer == gm)
                {
                    Debug.Log("ground");
                    hitType = HitType.Ground;
                }
                else if (raycastHit.collider.gameObject.layer == lwm)
                {
                    //Debug.Log("lightweight");
                    hitType = HitType.Lightweight;
                    goToMove = raycastHit.collider.gameObject;
                    string raycastHitObjectname = goToMove.name;
                }

                state = State.HookShotThrown;
            }
        }

        
    }

EDIT2:

private void HandleHookShotGrab()
    {
        GameObject raycastHitObject = GameObject.Find(raycastHitObjectName);
    }

错误出现在raycastHitObjectName 错误:

CS0103 the name 'raycastHitObjectName' does not exist in the current context

【问题讨论】:

  • raycastHit.transform.position = .... ?也许我不明白你的问题,但如果你已经有一个 Transform 参考......是什么阻碍你移动对象?
  • 哦,移动被击中的游戏对象是完全有意义的

标签: unity3d raycasting gameobject


【解决方案1】:

您不需要按名称查找游戏对象,您可以在要从中移动游戏对象的脚本中添加对游戏对象的引用。

public RaycastHit raycastHit; 
public GameObject goToMove;//drag in to your gameObject component in unity editor

private void HandleRayCast()
{
    if (Physics.Raycast(transform.position, cam.transform.forward, out raycastHit))
    {
        //Hit Something
        goToMove.transform.position = raycastHit.point; 
    }
}

如果你仍然需要通过名称找到游戏对象,你仍然可以进入Start阶段。

void Start() {
    goToMove = GameObject.Find("yourGameObjectName");
}

不要在Updates 中使用GameObject.Find。在Monobehaviours 的初始化阶段使用它来保持对游戏对象的引用。在小型游戏或游戏项目中,这没什么大不了的,但它是一个“昂贵”的命令,因此需要小心使用。

【讨论】:

  • 请注意,raycastHit 是使用 out 关键字通过引用传递的公共类变量。执行HandleRayCast 时,变量的值被“填充”,所以如果变量是public,您可以从代码中的任何位置访问它,如果它是pravate,您可以从其中的任何方法访问它班级
  • 你可以去this看看
  • 你得到什么错误,在哪一行?光线投射真的命中了吗?
  • 如果名称是您使用的名称 (string raycastHitObjectname = goToMove.name;),它就是您需要公开的字符串。将您的 string raycastHitObjectname; 设为公共类变量
  • 但是,当您需要设置位置时,最好使用命中GameObject的引用而不是保留名称并在场景中通过字符串查找gameoObject的名称
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
相关资源
最近更新 更多