Открытый кухонный шкаф на клавиатуре от Unity - PullRequest
1 голос
/ 05 июня 2019

Я недавно скачал кухонный шкаф → https://www.cgtrader.com/3d-models/interior/kitchen/ca-5cd9388f-0be1-4cea-ab44-bc1b493f590f

Так что в принципе все работает нормально, однако я добавил контроллер игрока и хочу, чтобы в каждом шкафу игрок нажал E, чтобы открыть его. У меня есть некоторые серьезные трудности с этим, хотя, поскольку каждый шкаф открывается вместо одного, и я не знаю, как сосредоточиться только на одном за раз, может быть, добавление боксового коллайдера, когда игрок находится рядом со шкафом?

Кроме того, я обнаружил два различных типа нажатия клавиш:

Input.GetKeyDown(KeyCode.E) =, который слегка открывает каждый шкаф, но не полностью

Input.GetKey("e") =, который полностью открывает каждый шкаф, но вы должны продолжать нажимать E, и это не то, что я хочу.

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

public class Door : MonoBehaviour {

    public bool isopen;
    public float speed;

    [SerializeField]
    float Open,Close;


    private void Awake()
    {

    }
    void Start () {

    }

    // Update is called once per frame
    void Update () {

        if (Input.GetKey("e"))
        {
            isopen = true;
            Quaternion open = Quaternion.Euler(Open, 90, 90);
            transform.localRotation = Quaternion.Slerp(transform.localRotation, open, Time.deltaTime * speed);
        }

        else
        {
            isopen = false;
            Quaternion close = Quaternion.Euler(Close, 90, 90);
            transform.localRotation = Quaternion.Slerp(transform.localRotation, close, Time.deltaTime * speed);

        }
    }


    void PlayAnim()
    {
        print("hit");

        if (isopen)
        {
            isopen = false;
        }

        else
        {
            isopen = true;
        }

    }
}

Вот мой скрипт 'HIT':

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

public class hit : MonoBehaviour
{

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

        if (Input.GetKeyDown(KeyCode.E))
        {
            RaycastHit hit;
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out hit, 100.0f))
            {

                hit.transform.SendMessage("PlayAnim");
            }
        }
    }
}

Однако, скрипт работает только для моих ящиков, но не для моего шкафа, которые все слегка открываются при нажатии E. Но когда игрок смотрит на ящик, он нажимает E, и открывается только ящик, на котором он сфокусирован, те же шаги, чтобы закрыть его. Я добавил скрипт HIT в свои шкафы, хотя ...

Итак, я хотел бы иметь возможность открыть один шкаф, когда это необходимо, и снова нажать E, чтобы закрыть его. Как я должен делать? Любые направления? Большое спасибо, ребята.

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Наконец-то работает! Я добавил скрипт удара и Physics.RayCast и отредактировал скрипт двери. Теперь мне нужно выяснить, как добавить текстовый холст и заставить его исчезать при необходимости. В любом случае, спасибо!

0 голосов
/ 05 июня 2019

Эту проблему лучше всего решить, разбив ее на части: выбрав шкаф с ключом, открыв / закрыв его и запустив анимацию.

Если вы используете вид от первого лица, вы можете проверитьна какой шкаф смотрит игрок, бросая луч с помощью Physics.Raycast () из положения камеры в направлении, в котором он смотрит.Если получившийся RaycastHit столкнулся со шкафом, его нужно будет открыть.Между прочим, GetKeyDown () запускается один раз для одного Update () при нажатии клавиши, GetKey () срабатывает до тех пор, пока клавиша удерживается.Вы хотите запускать только один раз и с этого момента запускать анимацию самостоятельно, поэтому используйте GetKeyDown ().Вы, вероятно, не захотите использовать для этого коробочный коллайдер, поскольку игрок может открыть шкаф позади него, просто потерев его спину и нажав «е».

Затем в другом сценарии, прикрепленном кшкафы, вы должны иметь функцию, чтобы открыть / закрыть их.Как только он вызывается, вы проверяете, движется ли он в данный момент, и, если нет, запускаете анимацию.

Анимация должна будет вращать дверь в каждом кадре в Update (), пока она не достигнет целевой позиции.,Сохранив, как далеко он уже продвинулся, и закрывается ли он или открывается в переменных, это будет довольно легко достичь, потому что вам уже удалось заставить их вращаться в правильном направлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...