Я делал игру о собачках-яйцах, которые могут стрелять друг в друга, чтобы играть с моим братом (ему почему-то так нравятся собачки). Это будет личное. И у него должна была быть механика автоматического прицеливания, которая будет нацеливаться на ближайшего врага. Идея заключалась в том, что когда игрок попадает в ваш диапазон с помощью триггерного коллайдера, игрок добавляется в список целей, а затем метод вычисляет ближайшего игрока.
Я написал код, и он работал почти идеально, однако при изменении списка проигрыватель случайным образом ускоряется. Понятия не имею, почему это происходит. Я пробовал комментировать много кода и изменять список откуда-то еще, и, похоже, это происходит только тогда, когда список изменяется. Вот код:
Это мой основной контроллер 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 ответ
На ваш rigidbody.velocity
влияет только Input
. Никакой связи со списком целей. В любом случае, вам нужно изменить твердые тела в FixedUpdate()
, и вам не следует явно изменять скорость, рассмотрите возможность использования Rigidbody.AddForce()
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.