Unity - Aim Line (Line Renderer) не отображается в 2D-шутере - PullRequest
0 голосов
/ 06 февраля 2019

Я новичок в Unity и создаю небольшую 2D игру-стрелялку для школьного проекта, и мне уже удалось создать в главном персонаже функциональную систему стрельбы, которая даже отскакивает от некоторых объектов с помощью Unity Physics.

Теперь я хотел интегрировать линию прицеливания, которая будет предсказывать траекторию пули, в том числе отскок на объектах (стиль пузырькового стрелка).

Я нашел скрипт, который использует Raycast и Line Renderer, и он предположительно делает это, и я попытался интегрировать его в мой скрипт оружия, но, хотя он не дает никакой ошибки, он просто ничего не показывает, когда я тестируюигра.Я не знаю, заключается ли проблема в настройках, которые я установил в компоненте Line Renderer, или в сценарии.

Может ли кто-нибудь помочь мне понять, где моя ошибка, и указать правильный путь?

Моя цель:

Game idea

Определения компонентов My Line Renderer:

Line Renderer Definitions

Сценарий «Моё оружие»:

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

[RequireComponent(typeof(LineRenderer))]
public class Weapon : MonoBehaviour
{
[Range(1, 5)]
[SerializeField] private int _maxIterations = 3;
[SerializeField] private float _maxDistance = 10f;

public int _count;
public LineRenderer _line;

public Transform Firepoint;
public GameObject BulletPrefab;
public GameObject FirePrefab;

void Start()
{
    _line = GetComponent<LineRenderer>();
}

// Update is called once per frame
 void Update()
{
  if (Input.GetButtonDown("Fire1"))
    {
        Shoot();
    }

    _count = 0;
    _line.SetVertexCount(1);
    _line.SetPosition(0, transform.position);
    _line.enabled = RayCast(new Ray(transform.position, transform.forward));
}

void Shoot()
{
    //shooting logic
    var destroyBullet = Instantiate(BulletPrefab, Firepoint.position, Firepoint.rotation);
    Destroy(destroyBullet, 10f);
    var destroyFire = Instantiate(FirePrefab, Firepoint.position, Firepoint.rotation);
    Destroy(destroyFire, 0.3f);
}

private bool RayCast(Ray ray)
{
    RaycastHit hit;
    if (Physics.Raycast(ray, out hit, _maxDistance) && _count <= _maxIterations - 1)
    {
        _count++;
        var reflectAngle = Vector3.Reflect(ray.direction, hit.normal);
        _line.SetVertexCount(_count + 1);
        _line.SetPosition(_count, hit.point);
        RayCast(new Ray(hit.point, reflectAngle));
        return true;
    }
    _line.SetVertexCount(_count + 2);
    _line.SetPosition(_count + 1, ray.GetPoint(_maxDistance));
    return false;
}
}

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Ну, я изменил физический материал пули, Friction на 0 и Bounciness на 1. Также на жестком теле2D линейное сопротивление, угловое сопротивление и гравитация все равно 0. Хотя это не идеальный отскок, это былоочень близко к тому, что я намерен для игры.Спасибо!Проверьте это: Игра Gif

Единственный минус в том, что моя пуля не поворачивается в направлении движения после отскока.Я пытался использовать transform.LookAt, но не сработало.Это мой сценарий пули:

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

 public class Bullet : MonoBehaviour
 {
 public float speed = 20f;
 public Rigidbody2D myRigidbody;


 // Start is called before the first frame update
 void Start()
 {
     this.myRigidbody = this.GetComponent<Rigidbody2D>();
     this.myRigidbody.velocity = transform.right * speed;
     transform.LookAt(transform.position + this.myRigidbody.velocity);
 }
 }

Но теперь у меня есть эта ошибка: Ошибка CS0034 Оператор '+' неоднозначен для операндов типа 'Vector3' и 'Vector2'

0 голосов
/ 07 февраля 2019

Unity имеет два физических движка: один для 2D и один для 3D.Предоставленный вами скрипт основан на механизме трехмерной физики и не будет работать для 2D коллайдеров.Я отредактировал ваш скрипт для работы с 2D коллайдерами.

В любом случае убедитесь, что все ваши игровые объекты используют одну и ту же физическую систему.Кроме того, оригинальный скрипт показывает только средство рендеринга строки, если он что-то ударил.Желаем удачи!

using UnityEngine;

[RequireComponent(typeof(LineRenderer))]
public class Weapon : MonoBehaviour
{
    [Range(1, 5)]
    [SerializeField] private int _maxIterations = 3;

    [SerializeField] private float _maxDistance = 10f;

    public int _count;
    public LineRenderer _line;

    public Transform Firepoint;
    public GameObject BulletPrefab;
    public GameObject FirePrefab;

    private void Start()
    {
        _line = GetComponent<LineRenderer>();
    }

    // Update is called once per frame
    private void Update()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            Shoot();
        }

        _count = 0;
        _line.SetVertexCount(1);
        _line.SetPosition(0, transform.position);
        _line.enabled = true;
        RayCast(transform.position, transform.up);
    }

    private void Shoot()
    {
        //shooting logic
        var destroyBullet = Instantiate(BulletPrefab, Firepoint.position, Firepoint.rotation);
        Destroy(destroyBullet, 10f);
        var destroyFire = Instantiate(FirePrefab, Firepoint.position, Firepoint.rotation);
        Destroy(destroyFire, 0.3f);
    }

    private bool RayCast(Vector2 position, Vector2 direction)
    {
        RaycastHit2D hit = Physics2D.Raycast(position, direction, _maxDistance);
        if (hit && _count <= _maxIterations - 1)
        {
            _count++;
            var reflectAngle = Vector2.Reflect(direction, hit.normal);
            _line.SetVertexCount(_count + 1);
            _line.SetPosition(_count, hit.point);
            RayCast(hit.point + reflectAngle, reflectAngle);
            return true;
        }

        if (hit == false)
        {
            _line.SetVertexCount(_count + 2);
            _line.SetPosition(_count + 1, position + direction * _maxDistance);
        }
        return false;
    }
}
...