Пытаясь написать код C #, чтобы заставить ракету следовать за игроком в Unity - PullRequest
0 голосов
/ 04 июня 2018

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

Вот код:

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

public class HomingMissile : MonoBehaviour
{
    private GameObject target; //changed to private
    private Rigidbody rb;
    public float rotationSpeed;
    public float speed;

Quaternion rotateToTarget;
Vector3 direction;

private void Start()
{
    target = GameObject.FindGameObjectWithTag("Player"); //uncommented this
    rb = GetComponent<Rigidbody>();
}

private void FixedUpdate()
{
    //made some modifications
    Vector3 direction = (target.transform.position - transform.position).normalized;
    float angle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg;//interchanged x and z
    Quaternion rotateToTarget = Quaternion.Euler(0, angle, 0);
    transform.rotation = Quaternion.Slerp(transform.rotation, rotateToTarget, Time.deltaTime * rotationSpeed);
    Vector3 deltaPosition = speed * direction * Time.deltaTime;
    rb.MovePosition(transform.position + deltaPosition);

}

}

Я выбрал цель (преобразование) с помощью инспектора,Я использую Unity и C #, очевидно, вы это знаете.

Я пытаюсь добиться того, чтобы ракета следовала за положением цели в реальном времени.И я могу сам добавить код уничтожения ракеты. Примечание: Пожалуйста, не отмечайте это как дубликат.Это не.Игра 2D, где Y всегда постоянен.Вертикальная ось X и Горизонтальная ось X. Объекты 3D.Вот почему я не могу использовать hardbody2D.

РЕДАКТИРОВАТЬ: Код отредактирован.Ракета следует за целью, а также указывает на направление движения.Как заставить ракету вращаться по кругу, когда она должна вращаться?

1 Ответ

0 голосов
/ 04 июня 2018

Во-первых, рассмотрим:

Используйте взамен rigidbody.movePosition() и rigidbody.moveRotation().Вот пример:

Vector3 dir = (target.transform.position - transform.position).normalized;
Vector3 deltaPosition = speed * dir * Time.deltaTime;
rb.MovePosition(transform.position + deltaPosition);

Попробуйте rigidbody.MoveRotation() на практике.

Наконец, поймите, что есть много способов реализовать наведение для ракет. Вот тот, который обычно используется в реальной жизни.

Редактировать: я не буду рекомендовать использовать rb.addForce(), потому что, если вы попробуете это, вы поймете, что это слишком неопределенно.

...