2D轨迹太弱Unity

时间:2014-10-15 08:49:23

标签: c# unity3d 2d

再次问好StackOverflow,我目前正在努力使用我的轨迹弧码。我的问题是弧线太“弱”,这意味着它几乎直接掉落到地板上,同时我的射弹飞向远处。任何你能给我的帮助都将不胜感激。

相关代码:

using UnityEngine;
using System.Collections;

public class ProjectileDrag : MonoBehaviour {

//variables for catapult
public float maxStretch = 3.0f;
public LineRenderer catapultLineFront;
public LineRenderer catapultLineBack;

private SpringJoint2D spring;
private Transform catapult;
private Ray rayToMouse;
private Ray leftCatapultToProjectile;
private float maxStretchSqr;
private float circleRadius;
private Vector2 prevVelocity;
private bool clickedOn = false;

//prediction line
int samples = 15;
float spacing = 0.1f;
private GameObject[] line;
private Vector3 home;
int force = 4;



void Awake(){
    spring = GetComponent<SpringJoint2D> ();
    catapult = spring.connectedBody.transform;
}

// Use this for initialization
void Start () {
    LineRendererSetup ();
    rayToMouse = new Ray (catapult.position, Vector3.zero);
    leftCatapultToProjectile = new Ray (catapultLineFront.transform.position, Vector3.zero);
    maxStretchSqr = maxStretch * maxStretch;
    CircleCollider2D circle = collider2D as CircleCollider2D;
    circleRadius = circle.radius;

    line = new GameObject[samples];
    for (int i = 0; i < line.Length; i++){
        var go = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        go.collider.enabled = false;
        go.transform.localScale = new Vector3(0.2f,0.2f,0.2f);
        line[i] = go;
    }

    home = transform.position;
}

void FixedUpdate(){

    if (clickedOn)
            DisplayLine ();
}


// Update is called once per frame
void Update () {

    if (clickedOn)
            Dragging ();

    if (spring != null) {
        if(!rigidbody2D.isKinematic && prevVelocity.sqrMagnitude > rigidbody2D.velocity.sqrMagnitude){
            Destroy (spring);
            rigidbody2D.velocity = prevVelocity;
        }
        if (!clickedOn)
            prevVelocity = rigidbody2D.velocity;

        LineRendererUpdate();
            } else {
        catapultLineFront.enabled = false;
        catapultLineBack.enabled = false;
            }

}

void LineRendererSetup(){
    catapultLineFront.SetPosition (0, catapultLineFront.transform.position);
    catapultLineBack.SetPosition (0, catapultLineBack.transform.position);


    catapultLineFront.sortingLayerName = "Foreground";
    catapultLineBack.sortingLayerName = "Foreground";


    catapultLineFront.sortingOrder = 3;
    catapultLineBack.sortingOrder = 1;

}

void OnMouseDown(){
    spring.enabled = false;
    clickedOn = true;
}

void OnMouseUp(){
    spring.enabled = true;
    rigidbody2D.isKinematic = false;
    clickedOn = false;
}

void Dragging(){
    Vector3 mouseWorldPoint = Camera.main.ScreenToWorldPoint (Input.mousePosition);
    Vector2 catapultToMouse = mouseWorldPoint - catapult.position;

    if (catapultToMouse.sqrMagnitude > maxStretchSqr) {
            rayToMouse.direction = catapultToMouse;
        mouseWorldPoint = rayToMouse.GetPoint(maxStretch);
            }

    mouseWorldPoint.z = 0.0f;
    transform.position = mouseWorldPoint;

}

void LineRendererUpdate(){

    Vector2 catapultToProjectile = transform.position - catapultLineFront.transform.position;
    leftCatapultToProjectile.direction = catapultToProjectile;
    Vector3 holdPoint = leftCatapultToProjectile.GetPoint (catapultToProjectile.magnitude + circleRadius);
    catapultLineFront.SetPosition (1, holdPoint);
    catapultLineBack.SetPosition (1, holdPoint);

}

void DisplayLine(){
    line [0].transform.position = transform.position;
    Vector3 v3 = transform.position;
    float y = (force * (home - transform.position)).y;
    float t = 0.0f;
    v3.y = 0.0f;

    for (int i = 1; i < line.Length; i++) {
        v3 += force * (home - transform.position) * spacing;
        t += spacing;
        v3.y = y * t + 0.5f * Physics2D.gravity.y * t * t + transform.position.y;
        line[i].transform.position = v3;
            }
}

}

问题图像(全功率拍摄):

Full power shot. Weak prediction line.

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

private int actualFoce = 0;

void Update(){
   Vector2 distanceFromCatapult = Vector2(transform.position.x - catapult.x, transform.position.y - catapult.y);
   actualForce = distanceFromCatapult.magnitude + force;

   //then the rest of your code
}

在你的DisplayLine()中使用actualForce并投射你的射弹。

相关问题