как составить прогнозную траекторию ar c при прицеливании? - PullRequest
1 голос
/ 08 мая 2020

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

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

public class movement: MonoBehaviour
{
    public float velocity;
    float time;
    float x;
    float y;
    float tt;
    float g;
    Vector2 force;
    public float power = 2.0f;
    Vector3 startpoint;
    Vector3 endpoint;
    Camera cam;
    public Vector2 maxpower;
    public Vector2 minpower;
    public Rigidbody2D rb;
    Vector3 currentposition;
    Vector3 sp;
    LineRenderer lr;
    int resolution = 10;
    Vector3 newpoint;
    // Start is called before the first frame update
    void Start()
    {
        time = 0f;
        g = Mathf.Abs(Physics2D.gravity.y);
        cam = Camera.main;
        lr = GetComponent<LineRenderer>();
    }

    // Update is called once per frame
    void Update()
    {
        time += Time.deltaTime;
        x = gameObject.transform.position.x + velocity * time;
        tt = time * time;
        y = gameObject.transform.position.y + (g * tt) / 2f;
        if(Input.GetMouseButtonDown(0))
        {
            startpoint = cam.ScreenToWorldPoint(Input.mousePosition);
            startpoint.z = 5;
        }
        if(Input.GetMouseButton(0))
        {
            sp = new Vector3(gameObject.transform.position.x, gameObject.transform.position.y, 5);
            currentposition = cam.ScreenToWorldPoint(Input.mousePosition);
            currentposition.z = 5;
            LineRenderer(sp);
        }
        if (Input.GetMouseButtonUp(0))
        {
            endpoint = cam.ScreenToWorldPoint(Input.mousePosition);
            endpoint.z = 5;
            force = new Vector2(Mathf.Clamp(startpoint.x - endpoint.x, minpower.x, maxpower.x), Mathf.Clamp(startpoint.y - endpoint.y, minpower.y, maxpower.y));
            rb.AddForce(force * power, ForceMode2D.Impulse);
            x = x + velocity * time;
            y = y + (g * tt) / 2f;
            EndLine();
        }
    }
    public void LineRenderer(Vector3 p)
    {
        lr.positionCount = resolution;
        Vector3 arc = p;
        for(int i=0;i<resolution;i++)
        {
            newpoint = calculate(arc, i / (float)resolution);
            lr.SetPosition(i, newpoint);
            arc = newpoint;
        }
    }
    public Vector3 calculate(Vector3 point, float t)
    {
        point.x += velocity * t;
        point.y += 0.5f * g * t * t;
        return point;
    }
    public void EndLine()
    {
        lr.positionCount = 0;
    }
}

    ***

Это код, любая помощь приветствуется.

1 Ответ

0 голосов
/ 08 мая 2020

Я вижу ошибку в вашем дельта-времени:

Вы вызываете Calculate(arc, i/resolution), где i и resolution оба являются целыми числами.

Параметр может быть float time, но C# сначала вычислит i/resolution как целочисленное деление, а затем преобразует результат в число с плавающей запятой. Результат будет нулевым, пока i меньше resolution.

Измените его на: i/(float)resolution, чтобы заставить деление с плавающей запятой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...