Как исправить этот скрипт для Unity 3D - PullRequest
0 голосов
/ 01 августа 2020

Предполагается, что сценарий позволяет моему контроллеру / игроку от первого лица go подойти к объекту, нажать клавишу 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;
    }
}

}

введите описание изображения здесь

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Внутри pickup вы определяете int x и int y внутри блока if.

Вторая проблема заключается в том, что внутри (или после) метода pickup у вас есть одно закрытие } слишком много.

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

Таким образом, вы в основном завершаете свой класс перед методом checkDrop. Остальные - это просто последующие ошибки: x и y будут известны только в этом блоке кода, и когда вы позже попытаетесь использовать их в

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;
            }
        }
    }
}
0 голосов
/ 01 августа 2020

Может, тебе стоит попробовать использовать Raycast для подбора предметов. Создайте тег "Поднять", добавьте этот тег ко всем предметам, которые можно поднять, снимите Raycast с камеры в направлении камеры, если игрок нажимает 'E', проверьте, есть ли у удара тег, затем возьмите его . Выполните поиск по "Raycast tutorial", и вы найдете много результатов.

...