簡體   English   中英

如何為 Unity 3D 修復此腳本

[英]How do I fix this script for Unity 3D

該腳本應該允許我的第一人稱控制器/播放器 go 到 object,按 E 鍵然后拿起並隨身攜帶 object。 腳本中有錯誤,我還不明白如何編程。 我還附上了代碼中錯誤的屏幕截圖以供參考。

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;
    }
}

}

在此處輸入圖像描述

也許您應該嘗試使用 Raycast 來拾取物品。 創建一個“Pick Up”標簽,將該標簽添加到所有可拾取物品,如果玩家按下“E”,則從相機向相機方向發射 Raycast,檢查命中是否有標簽,然后將其拾取. 搜索“Raycast 教程”,你會發現很多結果。

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 之前結束你的checkDrop rest 只是后續錯誤: xy僅在此代碼塊中是已知的,當您稍后嘗試在

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

它們不存在。

也正如您和 class 所說的那樣,方法checkDropUpdate中是未知的。 然后你會得到一些額外的錯誤,因為不允許在類型之外定義方法。


請注意,我格式化了您的代碼,所以現在應該很清楚了。 你可能更希望它做

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;
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM