再次问好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;
}
}
}
问题图像(全功率拍摄):
答案 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并投射你的射弹。