1.創建一個物體(player)作爲投出物體的投擲點,隨便創建一個Plane作爲地板。
(這裏使用一個Capsule作爲投擲點)
2.創建一個空物體(改名為line),在空物體上添加LineRenderer(如果需要修改材質,請自行修改,此處使用默認的材質和參數)
3.創建一個小球做為投擲終點(材質用了綠色)
5.最終的Hierarchy面板主要有
7.
8.最終實現代碼(思想:根據公式計算出每個時刻的投擲物位置點在哪,再將各點鏈接成軌跡)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Linectrl : MonoBehaviour
{
//定义一个LineRenderer
public LineRenderer line;
//定义一个小球
public Transform xiaoqiu;
//多少个点
public int length=1000;
//定义一个时间间隔,每隔多少时间计算一下点的位置
public float t;
//定义一个初速度
public float speed;
//生產小球
public GameObject obj;
private void Update()
{
if(Input.GetMouseButtonDown(0))
{
//顯示line
line.gameObject.SetActive(true);
//顯示小球
xiaoqiu.gameObject.SetActive(true);
//獲得點
List<Vector3> list = GetPoints();
//設置點的數量
line.positionCount = list.Count;
//設置坐標點
line.SetPositions(list.ToArray());
//將小球放到最後一個點的位置
xiaoqiu.position = list[list.Count - 1];
}
if(Input.GetMouseButtonUp(0))
{
//鬆開手隱藏line
line.gameObject.SetActive(false);
//隱藏小球
xiaoqiu.gameObject.SetActive(false);
//儅鬆手生成手雷,位置和轉向為當前位置和轉向
Instantiate(obj,transform.position,transform.rotation).GetComponent<Rigidbody>().velocity = speed * transform.forward;
}
}
/// <summary>
/// 返回抛物线上一系列的点
/// </summary>
/// <returns></returns>
List<Vector3> GetPoints()
{
//存放点
List<Vector3> list = new List<Vector3>();
//水平方向的向量
Vector3 HorizontalDir = new Vector3(transform.forward.x, 0, transform.forward.z).normalized;//变成单位向量
//计算夹角(抛出去的方向与水平方向的夹角),可以求出水平方向的分量和垂直方向的分量
float angle = Vector3.Angle(transform.forward, HorizontalDir);
//水平分量
float HorizontalSpeed = Mathf.Cos(angle / 180 * Mathf.PI) * speed;//度变成弧度
//垂直方向的初速度
float VerticalSpeed = Mathf.Sin(angle / 180 * Mathf.PI) * speed;
for (int i = 0; i < length; i++)
{
//计算每一个时间间隔的坐标点
Vector3 pos = transform.position + (HorizontalSpeed*t*HorizontalDir*i)+((VerticalSpeed+(VerticalSpeed+Physics.gravity.y*t*i))/2*t*i*Vector3.up);//起始位置+水平方向的位移(速度*时间*i*方向)+垂直位移(垂直方向的初速度+(垂直方向的初速度+速度的变化量(加速度*时间*i))/2*t*i*向上的方向)注意:因爲計算每個點,采取一段段生成,需要*上i
//添加到List中
list.Add(pos);
//判断是否撞墙等障碍物(射綫檢測)每次算出一個點,都要判斷它跟上一個點之間有沒有碰撞
if(i>0)//i大於零時,一定有兩個點在List中,射綫檢測需要兩個點
{
//倒數第二個點與倒數第一個點的方向,倒數第一個點減去倒數第二個點。
Vector3 dr = list[list.Count - 1] - list[list.Count - 2];
//存儲碰撞信息
RaycastHit hit;
if (Physics.Raycast(list[list.Count-2],dr,out hit,dr.magnitude))
{
list[list.Count - 1] = hit.point;
//碰撞后不需要再添加後續的點了
break;
}
}
}
return list;
}
}
9.回到Unity中,創建一個Spere作爲投擲物的Prefab,然後將脚本添加到player上
Line為帶有LineRenderer的物體
Xiaoqiu為投擲終點
Length為點數,畫出軌跡的點的個數
T為間隔時間(畫出點的間隔)
Speed為投擲物體的初速度
Obj為投擲的物體
10.實現效果