Я делал игру о собачках-яйцах, которые могут стрелять друг в друга, чтобы играть с моим братом (ему почему-то так нравятся собачки). Это будет личное. И у него должна была быть механика автоматического прицеливания, которая будет нацеливаться на ближайшего врага. Идея заключалась в том, что когда игрок попадает в ваш диапазон с помощью триггерного коллайдера, игрок добавляется в список целей, а затем метод вычисляет ближайшего игрока.

Я написал код, и он работал почти идеально, однако при изменении списка проигрыватель случайным образом ускоряется. Понятия не имею, почему это происходит. Я пробовал комментировать много кода и изменять список откуда-то еще, и, похоже, это происходит только тогда, когда список изменяется. Вот код:

Это мой основной контроллер EggDog:

using UnityEngine;

public class EggdogController : MonoBehaviour
{
    Rigidbody2D rb;
    Animator an;
    public int PlayerNo;
    public float speed;

    public Transform pickupParent;
    public Transform currentPickupTarget;

    public List<Transform> targetList = new List<Transform>();
    public Transform currentTarget;

    void Awake(){
        rb = GetComponent<Rigidbody2D>();
        an = GetComponent<Animator>();
    }

    void Update(){
        Move();
        Boba();
        PickTarget();
    }

    void Move(){
        Vector3 move = new Vector3(0,0,0);
        move.x = Input.GetAxisRaw("Horizontal" + PlayerNo.ToString());
        move.y = Input.GetAxisRaw("Vertical" + PlayerNo.ToString());
        rb.velocity = move*speed*Time.deltaTime;
    }

    void Boba(){
        an.SetBool("longing", Input.GetAxisRaw("Boba" + PlayerNo.ToString()) == 1);       
    }

    void PickTarget()
    {
        if(targetList.ToArray().Length > 0)
        {
            float currentDistance = -69f;
            foreach (Transform potato in targetList.ToArray())
            {
                float thistance = Vector3.Distance(transform.position, potato.position);
                if(currentDistance == -69f)
                {
                    currentDistance = thistance;
                    currentTarget = potato;
                }
                else
                {
                    if(currentDistance > thistance)
                    {
                        currentTarget = potato;
                    }
                }
            }          
        }
    }   
}  

А это мой скрипт EggdogTriggerTarget, прикрепленный к дочернему объекту с помощью коллайдера триггера:

using System.Collections.Generic;
using UnityEngine;

public class EggdogTriggerTarget : MonoBehaviour
{
    EggdogController parent;

    private void Awake()
    {
        parent = transform.parent.GetComponent<EggdogController>();
    }

    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Player"))
        {
            parent.targetList.Add(other.transform);
        }
    }

    private void OnTriggerExit2D(Collider2D other)
    {
        if (other.CompareTag("Player"))
        {
            bool exists = false;
            foreach (Transform tr in parent.targetList.ToArray())
            {
                if (tr == other.transform)
                {
                    exists = true;
                }
            }
            if (exists)
            {
                parent.targetList.Remove(other.transform);
            }
        }
    }
}

В сети нет сообщений об ошибках или чего-либо еще. Буду рад, если вы поможете.

-1
TahaSener07 25 Июл 2020 в 21:37

1 ответ

Лучший ответ

На ваш rigidbody.velocity влияет только Input. Никакой связи со списком целей. В любом случае, вам нужно изменить твердые тела в FixedUpdate(), и вам не следует явно изменять скорость, рассмотрите возможность использования Rigidbody.AddForce()

0
luvjungle 26 Июл 2020 в 09:24