Двумерный шутер на языке Unity - PullRequest
0 голосов
/ 06 мая 2020

Я бы хотел использовать язык персонажей, чтобы вместо того, чтобы стрелять пулей, она летела в сторону врага, облизывала его и возвращалась. Я получил такую ​​формулировку из этого вопроса: Стрельба в Unity с игрой Tongue 2d (ответа нет, ему 4+ лет). Единственная разница в том, что мой персонаж двигается.

Я получил этот код из учебника по стрельбе, поэтому, когда вы щелкаете, сборка языка генерируется и находится под правильным углом. Мне нужно, чтобы он увеличивался при нажатии и уменьшался.

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

public class LineController : MonoBehaviour
{
    public GameObject player;
    private Vector3 target;
    public GameObject crosshairs;
    public GameObject tonguePrefab;

    // Start is called before the first frame update
    void Start()
    {
        Cursor.visible = false;
    }

    // Update is called once per frame
    void Update()
    {
        target = transform.GetComponent<Camera>().ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, transform.position.z));
        crosshairs.transform.position = new Vector2(target.x, target.y);

        Vector3 difference = target - player.transform.position;
        float rotationZ = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;

        if (Input.GetMouseButtonDown(0))
        {
            shootTongue(rotationZ);
        }
    }

    IEnumerator shootTongue(float rotationZ)
    {
        GameObject t = Instantiate(tonguePrefab) as GameObject;
        t.transform.position = new Vector2(target.x, target.y);
        t.transform.rotation = Quaternion.Euler(0.0f, 0.0f, rotationZ);

        yield return new WaitForSeconds(2000);

        t.SetActive(false);
    }
}

Я также пытался заставить его исчезнуть через какое-то время, и с этим он вообще не работает?

Ответы [ 2 ]

0 голосов
/ 10 мая 2020

1) Я предлагаю создавать анимацию спрайтов / листов спрайтов с помощью Mecanim или относительно новую скелетную анимацию с помощью Anima2D . С помощью этих систем вы можете создавать красивые анимации, переходы, даже анимировать сферический коллайдер, чтобы вызывать столкновения и действия, изменять активное состояние ваших объектов и т. Д. c. и управляйте анимацией с очень небольшим кодом. На мой взгляд, таким образом можно добиться наилучшего эффекта.

Ведь язык не пуля ... :) Нужен только один. Я не думаю, что вы хотите создавать экземпляры / создавать префабы каждый раз, когда нажимаете кнопку «лизать». Вместо этого вы должны просто включить / выключить свой языковой объект (gameObject.SetActive). Вы также можете изменить активное состояние объекта в анимации. Так что, если вы не знаете, как это кодировать, вы можете сделать большую часть этого в окне «Анимация» и использовать очень простой код для воспроизведения анимации при нажатии кнопки «лизать». Каждый раз, когда сферический коллайдер касается чего-либо, вы можете указать контроллеру аниматора воспроизвести анимацию «отката», и она плавно перейдет в начальную позицию.

Существует множество руководств по Mecanim, Animations, 2D Animations, Anima2D, Animator Controller.

2) Если вам нужен очень хороший контроль над языком, вы можете создать собственный me sh и управлять им с помощью скрипта, но это намного сложнее.

3) Причина, по которой ваш объект не выключается, вероятно, заключается в том, что вы написали WaitForSeconds (2000), поэтому он выключится через 2000 секунд - более получаса. Вы также должны вызвать его с помощью StartCoroutine (shotTongue ()), поскольку это сопрограмма. Опять же, если вы хотите выключить объект, не создавайте каждый раз новые. Если вы хотите продолжать создавать новые объекты, вы должны вместо этого уничтожить объекты. В противном случае в вашей сцене будет много деактивированных языков, и я не думаю, что вам нужно столько языков.

0 голосов
/ 06 мая 2020

Если префаб - это просто линия с простой текстурой, я предлагаю использовать средство визуализации линии:

  1. Создайте пустое преобразование, которое начинается во рту, а затем перемещается, пока не достигнет перекрестия. Перемещение выполняется с помощью Vector2.MoveTowards .
  2. Ваш язык не будет компонентом рендеринга линий. Этот рендерер строк будет иметь 2 точки, начало - это stati c, а конец, который вы должны обновить, например, в Update (), чтобы соответствовать позициям пустого преобразования в элементе 1.

Если вы действительно используете sh для расширения игрового объекта языка, тогда вам понадобится немного математики, этот ответ имеет то, что вам нужно, но в 3D: https://answers.unity.com/questions/473076/scaling-in-the-forward-direction.html

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