C# 如何修复Unity 3D的此脚本

C# 如何修复Unity 3D的此脚本,c#,unity3d,game-development,C#,Unity3d,Game Development,该脚本应该允许我的第一人称控制器/播放器进入一个对象,按下E键,然后拾取并携带该对象。脚本中有错误,我还不知道如何编程。我还附上了代码中错误的截图以供参考 using System.Collections; using System.Collections.Generic; using UnityEngine; public class PickupObject : MonoBehaviour { GameObject mainCamera; bool carrying;

该脚本应该允许我的第一人称控制器/播放器进入一个对象,按下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;
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类PickupObject:单行为
{
游戏机;
布尔携带;
游戏对象承载对象;
公众浮标距离;
公共交通畅通;
//在第一帧更新之前调用Start
void Start()
{
mainCamera=GameObject.FindWithTag(“mainCamera”);
}
//每帧调用一次更新
无效更新()
{
如果(携带)
{
携带(携带对象);
checkDrop();
}
其他的
{
拾音器();
}
}
空携带(游戏对象o)
{
o、 GetComponent().IsKinetic=true;
o、 transform.position=Vector3.Lerp(mainCamera.transform.position+mainCamera.transform.forward*距离、时间、延迟时间*平滑);
}
无效拾取()
{
if(Input.GetKeyDown KeyCode.E;))
{
int x=屏幕宽度/2;
int y=屏幕高度/2;
}
Ray Ray=mainCamera.GetComponent().ScreentPointToRay(新矢量3(x,y));
雷卡斯特击中;
如果(物理.光线投射(光线,出击))
{
Pickupable p=hit.collider.GetComponent();
如果(p!=null)
{
携带=正确;
carriedObject=p.gameObject;
p、 gameObject.rigidbody.IsKinetic=true;
}
}
}
}
void checkDrop()
{
if(Input.GetKeyDown(KeyCode.E))
{
dropObject();
}
void dropObject()
{
携带=假;
carriedObject=null;
carriedObject.gameObject.rigidbody.IsKinetic=false;
}
}
}


也许您应该尝试使用光线投射来拾取项目。创建一个“拾取”标记,将该标记添加到所有可拾取的项目中,如果玩家按下“E”,则从相机向相机方向拍摄光线投射,检查命中是否有该标记,然后拾取。搜索“光线投射教程”,您将发现许多结果。

拾取
中定义
int x
int y
if
块中

第二个问题是,在
拾取
方法内(或之后),您有一个非常接近的
}

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

同样,正如您和类所说的,因此方法
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;
            }
        }
    }
}
无效拾取()
{
if(Input.GetKeyDown KeyCode.E;))
{
int x=屏幕宽度/2;
int y=屏幕高度/2;
Ray Ray=mainCamera.GetComponent().ScreentPointToRay(新矢量3(x,y));
雷卡斯特击中;
如果(物理.光线投射(光线,出击))
{
Pickupable p=hit.collider.GetComponent();
如果(p!=null)
{
携带=正确;
carriedObject=p.gameObject;
p、 gameObject.rigidbody.IsKinetic=true;
}
}
}
}

我找到了答案,添加了一个新脚本,现在代码中没有错误,但我试图拾取的对象漂浮在空中,当我放开它们时不会掉落。我有一个刚体在那里,既有重力也有运动学,它不会上升,但会掉到地上。知道如何解决这个问题吗?即使你不完全理解,也要解决第一个问题,检查它,看看它现在说了什么。。等
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;
            }
        }
    }
}