unity制作手雷抛物线

这篇具有很好参考价值的文章主要介绍了unity制作手雷抛物线。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这篇文章主要是介绍制作流程,读者可以根据自己所需修改代码,附有代码注释和全部代码;

第一步,在hierarchy面板创建一个Line物体,用于后面抛物线的渲染。

unity制作手雷抛物线

 第二步,属性Inspector面板修改属性;可以修改抛物线的宽度,Materials下一步制作;

 unity制作手雷抛物线

 第三步,制作透明的抛物线材质parabola;新建材质,编写透明材质所需着色器;

unity制作手雷抛物线

 1处选择所写的透明着色器parabola代码,全部代码如下,2处修改填充方式,3处可以更改透明度;注:也可以选择系统自带的着色器;

Shader "Unlit/parabola"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Transparent" "Quene"="Transparent"}
        LOD 100
        Blend SrcAlpha OneMinusSrcAlpha
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv+float2(_Time.y,0));
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }
}

第四步,开始抛物线的制作,根据确定发出点,初始速度,发出方向,每隔deltaTime计算抛物线上的点,然后把点位置储存在数组中,把数组传入绘制抛物线Line Rendererd的方法中;具体代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class ParabolaControl : MonoBehaviour
{
    private bool IsDown;
    private float Delay = 0.1f;                                         //延迟相当于按下持续时间
    private float LastDownTime = 1;//
    public GameObject point;                                         //设置一个抛出位置前方的点,可以通过改变这个点的位置,改变抛出初速度方向;
    public LineRenderer parabola;                                //抛物线
    public GameObject circle;                                       //抛物线末端小球
    public float timespan;                                                 //计算抛物线点的时间间隔
    public float speed;                                                       //手雷初速度标量
    public GameObject grenade;                                           //手雷预制体
    private GameObject player;                                           //玩家
    private Animator Anim;                                                    //玩家动画


    // Start is called before the first frame update
    void Start()
    {
        
        player = GameObject.FindGameObjectWithTag("Player");         //获取玩家
        Anim = player.GetComponent<Animator>();              //玩家动画
    }

    // Update is called once per frame
    void Update()
    {
        transform.forward = point.transform.position - gameObject.transform.position;//初速度方向
        if (IsDown)                              //判断手雷按钮按下后,绘制抛物线等操作
        {
            if (Time.time - LastDownTime >= Delay)                //是否为长按操作
            {
                circle.SetActive(true);                               //抛物线末端小球
                parabola.enabled = true;                         //持续画线
                List<Vector3> list = GetVector3s();              //线点集合
                parabola.positionCount = list.Count;
                parabola.SetPositions(list.ToArray());      //设置线点列表位置传入抛物线绘制方法
                circle.transform.position = list[list.Count - 1];    //抛物线末端最后一个点被挡住后画小球
                LastDownTime = Time.time;
            }
        }

    }
    
    public void buttondown()                                    //手雷按钮按下
    {
        IsDown = true;                                            //按钮标志为按下
        LastDownTime = Time.time;                       //持续时间
    }

    public void buttonup()                              //手雷按钮抬起事件
    {
        
        Debug.Log("雷按钮抬起");
        parabola.enabled = false;                         //取消手雷抛物线
        Anim.SetBool("Grenade", true);                  //玩家开火动画
        GameObject grenadeinstance = Instantiate(grenade, transform.position, transform.rotation); //生成手雷预制体
        grenadeinstance.GetComponent<Rigidbody>().velocity = speed * transform.forward;             //手雷的初速度矢量为速度和抛出点正方向的乘积
        Destroy(grenadeinstance, 3f);           //三秒后销毁手雷预制体

        circle.SetActive(false);
        IsDown = false;
    }

    List<Vector3> GetVector3s()
    {
        List<Vector3> list = new List<Vector3>();
        Vector3 horizontalDir = new Vector3(transform.forward.x, 0, transform.forward.z).normalized;//水平方向
        float angle = 360 - this.transform.rotation.eulerAngles.x;//与水平方向夹角
        float horizontalSpeed = Mathf.Cos(angle / 180 * Mathf.PI) * speed;//水平方向速度
        float verticalSpeed = Mathf.Sin(angle / 180 * Mathf.PI) * speed;//垂直方向速度
        for (int i = 0; i<1000 ; i++)//点数量上限为1000个
        {
            //点位置为初始位置加速度乘以时间间隔,方向向上
            Vector3 position = transform.position + (horizontalSpeed * timespan * i * horizontalDir)+ ((verticalSpeed + (verticalSpeed + Physics.gravity.y * timespan * i)) / 2 * timespan * i * transform.up);
            //某时刻抛物线点位置,
            list.Add(position);
            if(i > 0)//点大于两个,用于计算末尾方向rearDir
            {
                RaycastHit hit;
                Vector3 rearDir = list[list.Count - 1] - list[list.Count - 2];//最后一段被障碍物挡住的线段方向
                if(Physics.Raycast(list[list.Count - 2],rearDir,out hit,rearDir.magnitude))//
                {
                    list[list.Count - 1] = hit.point;                                  //最后一个点设为射线碰撞点
                    break;//结束
                }
            }
        }
        return list;//返回列表
    }
}

第四步:将此脚本ParabolaControl挂载在抛出点上;

unity制作手雷抛物线

 最后附上效果图:

unity制作手雷抛物线

 文章来源地址https://www.toymoban.com/news/detail-403888.html

到了这里,关于unity制作手雷抛物线的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 圆/椭圆/双曲线/抛物线等二次曲线的各种情况方程

    二次曲线(quadratic curves)由一般的具有两个变量的二次方程所隐含确定,即 其中, A = [ a i j ] A=[a_{ij} ] A = [ a ij ​ ] 为对称的2x2矩阵 B = [ b i ] 、 [ X = [ x i ] B=[b_{i}]、[X=[x_i] B = [ b i ​ ] 、 [ X = [ x i ​ ] 为2x1向量 二次曲线方程的矩阵形式表示为: 二次曲线方程可以定义点、线

    2024年02月12日
    浏览(42)
  • Android上传手机图片到服务器(这篇你要是看不懂,全网没你可以看懂的了!!!)

    通过安卓app选取本地图片然后上传到服务器的整体流程步骤如下: 样式 布局代码 id:iv_image用于呈现选择的图片 id:xz用于选择图片的按钮 id:sc用于上传的按钮 流程:点击“选择图片”在本机选取图片然后呈现到ImageView中 (这个操作过程是不需要申请任何权限的) (1)获

    2023年04月16日
    浏览(47)
  • 【C语言进阶篇】看完这篇结构体文章,我向数据结构又进了一大步!(结构体进阶详解)

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,结构体的基本使用和常见错误在上一篇详细讲解过了,不知道大家都学会了没有。    ⛳️ 今天给大家来个硬菜,教点高

    2024年02月15日
    浏览(48)
  • 怎么制作ai图片美女壁纸?快码住这篇ai绘画工具软件推荐合集

    用了ai制作的美女图片当壁纸,被朋友逼问了一下午! 近来这段时间迷上了ai绘画,挑了一张比较满意的生成图当壁纸,无意间被朋友看到还以为我背着他们偷偷脱单了,盘问了我一下午。 下面这几张图片都是我用ai绘画软件生成的,很不错吧? 看完大家是不是想问是这些图

    2024年02月16日
    浏览(63)
  • Python tkinter 制作文章搜索软件,精准定位想看文章

    前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 无聊的时候做了一个搜索文章的软件,有没有更加的方便快捷不知道,好玩就行了 环境使用 Python 3.8 Pycharm 模块使用 import requests import tkinter as tk from tkinter import ttk import webbrowser 第三方模块安装方法: win + R 输入cmd 输入安装命令

    2024年02月14日
    浏览(48)
  • Python tkinter 制作文章搜索软件

    今天,我无聊的时候做了一个搜索文章的软件,有没有更加的方便快捷不知道,好玩就行了。基于Python tkinter 制作文章搜索软件,都是一些基础的应用。🍖 🍗 🥩 代码 我们首先做到第一件事是导入模块。 代码 这段代码创建了一个名为 root 的Tkinter窗口对象,并设置了窗口的

    2023年04月08日
    浏览(48)
  • icloud照片要是关闭有什么影响?

    关闭iCloud照片将对您的设备和照片库产生以下影响: 1. 照片同步停止:关闭iCloud照片后,您的设备将不再自动同步照片到iCloud。这意味着您拍摄的新照片和录制的新视频将不会自动上传到iCloud照片库。                                     2. 存储空间释放:关闭iCloud照片

    2024年01月17日
    浏览(44)
  • DevOps系列文章 之 docker 制作kafka镜像

    Docker制作Kafka镜像教程 概述 本教程将指导你如何使用Docker制作一个Kafka镜像。Kafka是一个高性能、分布式的消息队列系统,用于处理大规模的实时数据流。使用Docker制作Kafka镜像可以方便地部署和管理Kafka集群。 整体流程 下面是制作Kafka镜像的整体流程: 步骤1:安装Docker 首先

    2024年02月15日
    浏览(34)
  • 知三维空间中任意旋转抛物面的顶点和焦点坐标,建立该旋转抛物面方程

            建立三维空间旋转抛物线方程的前提,首先需要确定三维空间直角坐标系的 位置,然后确定焦点和抛物面顶点的坐标,再利用焦点和抛物面顶点的坐标求出准面方程(我们这里把准面定义为是准线绕着焦点与抛物面顶点形成的直线旋转180°所形成的平面,且该平面垂

    2024年02月09日
    浏览(49)
  • 网站一天要是能有一万自然ip流量能有多少钱

    网站一天要是能有一万自然ip流量,能有多少钱?大家都说至少有100元,可是放广告点击率那么低,不可能到100的吖,谁懂啊,帮我解释下呗。不值百度联盟和谷歌联盟的广告点击率, 如果一个网站的日访问量为1万,那么其收入可能会达到330元。 但是,这需要考虑到该网站

    2024年02月20日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包