【问题标题】:How do I fix this script for Unity 3D如何为 Unity 3D 修复此脚本
【发布时间】:2020-08-01 17:53:48
【问题描述】:

该脚本应该允许我的第一人称控制器/播放器上到一个对象,按 E 键然后拾取并携带该对象。脚本中有错误,我还不明白如何编程。我还附上了代码中的错误截图以供参考。

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

public class PickupObject : MonoBehaviour
{
    GameObject mainCamera;
    bool carrying;
    GameObject carriedObject;
    public float distance;
    public float smooth;
    // Start is called before the first frame update
    void Start()
    {
        mainCamera = GameObject.FindWithTag("MainCamera");
    }

    // Update is called once per frame
    void Update()
    {
        if (carrying)
        {
            carry(carriedObject);
            checkDrop();
        }
        else
        {
            pickup();
        }
    }

    void carry(GameObject o)
    {
        o.GetComponent<Rigidbody>().isKinematic = true;
        o.transform.position = Vector3.Lerp (mainCamera.transform.position + mainCamera.transform.forward * distance, Time.deltaTime * smooth);
    }

    void pickup() 
    {
        if (Input.GetKeyDown KeyCode.E;))
        {
            int x = Screen.width / 2;
            int y = Screen.height / 2;
        }

        Ray ray = mainCamera.GetComponent<Camera>().ScreentPointToRay(new Vector3(x, y));
        RaycastHit hit;
        if(Physics.Raycast(ray, out hit))
        {
            Pickupable p = hit.collider.GetComponent<Pickupable>();
            if(p != null)
            {
                carrying = true;
                carriedObject = p.gameObject;
                p.gameObject.rigidbody.isKinematic = true;
            }
        }
    }
}

void checkDrop()
{
    if(Input.GetKeyDown(KeyCode.E))
    {
        dropObject();
    }
    void dropObject()
    {
        carrying = false;
        carriedObject = null;
        carriedObject.gameObject.rigidbody.isKinematic = false;
    }
}

}

【问题讨论】:

  • 即使你不完全理解,解决第一个问题,检查它,看看它现在说什么......等等。

标签: c# unity3d game-development


【解决方案1】:

也许您应该尝试使用 Raycast 来拾取物品。创建一个“Pick Up”标签,将该标签添加到所有可拾取物品,如果玩家按下“E”,则从相机向相机方向发射 Raycast,检查命中是否有标签,然后将其捡起.搜索“Raycast教程”,你会发现很多结果。

【讨论】:

  • 我想通了,添加了一个新脚本,现在代码中没有错误,但是我试图拾取的对象漂浮在空中,放手时不会掉落他们。我在那里有一个具有重力和运动学的刚体,尝试禁用运动学,它不会捡起但会掉到地上。知道如何解决这个问题吗?
【解决方案2】:

pickup 内,您可以在 if 块内定义 int xint y

第二个问题是在pickup 方法内(或之后)你有一个关闭} 很多。

if (Input.GetKeyDown KeyCode.E;))
{
    int x = Screen.width / 2;
    int y = Screen.height / 2;
} // <-- SEEMS THAT THIS HERE IS YOUR PROBLEM !

所以你基本上在方法checkDrop之前结束你的课程。其余的只是后续错误:xy 将仅在此代码块内以及您稍后尝试在其中使用它们时才知道

Ray ray = mainCamera.GetComponent<Camera>().ScreentPointToRay(new Vector3(x, y));

它们不存在。

正如你和班级所说,checkDrop 方法在Update 中是未知的。然后你会得到一些额外的错误,因为不允许在类型之外定义方法。


请注意,我已对您的代码进行了格式化,因此现在应该很清楚了。您可能更希望这样做

void pickup() 
{
    if (Input.GetKeyDown KeyCode.E;))
    {
        int x = Screen.width / 2;
        int y = Screen.height / 2;
    
        Ray ray = mainCamera.GetComponent<Camera>().ScreentPointToRay(new Vector3(x, y));
        RaycastHit hit;
        if(Physics.Raycast(ray, out hit))
        {
            Pickupable p = hit.collider.GetComponent<Pickupable>();
            if(p != null)
            {
                carrying = true;
                carriedObject = p.gameObject;
                p.gameObject.rigidbody.isKinematic = true;
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2019-05-03
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多