Авто-таргет и стрельба

116
27 августа 2021, 23:20

Есть код:

using UnityEngine;
public class Target : MonoBehaviour {
    public Transform player;
    public float range = 15;
    public int enemyLayer = 8;
    public Texture2D aim;
    public float aimSize = 50;
    private GameObject currentTarget;
    private Collider[] colliders = new Collider[0];
    void OnGUI() {
        if (currentTarget) {
            Vector2 tmp = new Vector2(Camera.main.WorldToScreenPoint(currentTarget.transform.position).x,
                                      Screen.height - Camera.main.WorldToScreenPoint(currentTarget.transform.position).y);
            Vector2 offset = new Vector2(-aimSize / 2, -aimSize / 2);
            GUI.DrawTexture(new Rect(tmp.x + offset.x, tmp.y + offset.y, aimSize, aimSize), aim);
        }
    }
    void FixedUpdate() {
        GetTarget();
        if (colliders.Length == 0) {
            currentTarget = null;
        } else {
            float curDist = Vector3.Distance(player.position, currentTarget.transform.position);
            if (curDist > range) {
                currentTarget = null;
            }
        }
    }
    void SetTarget() {
        if (colliders.Length > 0) {
            Collider currentCollider = null;
            float dist = Mathf.Infinity;
            foreach (Collider collider in colliders) {
                float currentDist = Vector3.Distance(player.position, collider.transform.position);
                if ((currentTarget && currentDist < dist && currentTarget != collider.gameObject) || currentDist < dist) {
                    currentCollider = collider;
                    dist = currentDist;
                }
            }
            currentTarget = currentCollider.gameObject;
        }
    }
    void GetTarget() {
        colliders = new Collider[0];
        colliders = Physics.OverlapSphere(player.position, range, 1 << enemyLayer);
        if (currentTarget) {
            return;
        }
        SetTarget();
    }
}

Код работает.
Но мне нужно сделать, чтобы он работал более правильно по отношению к моей задаче.
Есть 2 объекта, один на земле, второй в воздухе.
Мне нужно сделать так, что-бы если N дистанция до объекта совпадает то таргет взят, но если он уже пролетает над ним, то таргет теряется, то есть угол стрельбы должен быть примерно такой:

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

Помогите пожалуйста с расчетом, никак не могу разобраться...

Answer 1

Считаем угол цели относительно игрока

float Ang = Mathf.Atan2(target.y-player.y, target.x-player.x)/Mathf.PI*180f;

Находим разницу между углом поворота игрока и найденый

float DeltaAng = Mathf.DeltaAngle(playerAng, Ang);

Устанавливаем диапазон в N градусов

if (Mathf.Abs(DeltaAng ) < nAng) { /*tracking*/ }
else { /*lost taget*/ }
Answer 2

Все теперь работает правильно.

Vector3 CurrentTargetPos = currentTarget.transform.position;
CurrentTargetPos.y = transform.position.y;
Vector3 TargetDist = CurrentTargetPos - transform.position;
float angle = Vector3.Angle(TargetDist, transform.forward);
if (angle > maxAngle) {
    currentTarget = null;
}
READ ALSO
C#. Как в Windows Form изображение сделать круглым

C#. Как в Windows Form изображение сделать круглым

Создавая программу, мне понадобилось создать picture Box, который для моего дизайна должен быть круглымПомогите понять, как это сделать

111
Выполнение кода из textbox

Выполнение кода из textbox

Помогите реализовать такую идею: Ввожу в textbox1 определенный код и при нажатии на кнопку он выполняетсяИдеи с if(

169
Как защитить sql insert от sql injection в python?

Как защитить sql insert от sql injection в python?

Как защитить такой insert запрос от sql инъекций ? Я использую python 37 и БД mysql 5

169