如何在瞄准时制作一个预测性的轨迹弧线?

问题描述 投票:1回答:1

我试图建立一个轨迹弧线,以预测对象的轨迹路径,拖动和拍摄似乎很好,但弧线不工作。最初,我使用一个箭头来显示对象的运动方向,但后来我试图使用一个数组来做同样的事情,这将存储2个点,并将在每次迭代后不断更新,它会导致一个弧线,因为我使用运动方程来预测每帧后的位置。

    ***
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;
    }
}

    ***

这是代码,任何帮助是感激。

c# unity3d
1个回答
0
投票

我看到的一个错误是你的delta-time。

你调用 Calculate(arc, i/resolution),与 iresolution 都是整数。

参数可以是 float time但C#会先计算 i/resolution 作为一个整数除法,然后将结果转换为浮点数。结果将是零,只要 i 小于 resolution.

改为: i/(float)resolution 强制进行浮点除法

© www.soinside.com 2019 - 2024. All rights reserved.