Unity投擲物體

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.實現效果
在这里插入图片描述

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值