今天做一个FPS游戏的时候,由于我做的是第三人称的射击,所以需要一个枪的红外线瞄准的效果。

一开始我在枪上挂一个很细很长的聚光灯,瞄准远处物体的时候,看起来有点红外线的样子,但是靠近之后光线就变成一个手电筒的那种光,不是我想要的效果。

后来我用粒子特效,虽然远处近处都是一条射线,但是效果很粗糙,不是那种细细的有穿透的感觉,而是像激光一样,而且感觉不断生成粒子,性能消耗会很大。

最后在网上看到有人用Unity3.5自带的例子AngryBots里面有红外瞄准效果,但是代码有点问题,就改了一下,感觉效果还可以。

红外线瞄准的效果实现:

1.创建一个空节点叫Laser,添加Line Renderer组件,里面关联一个材质,材质使用AngryBots里面的LaserMaterial.mat,材质纹理贴图是LaserTexture.psd和SimpleNoise.psd。Shader使用AngryBots里面的LaserScope.shader。这个是射线。

2.创建一个平面叫LaserDot作为Laser节点的子节点,Scale都设置为0.02,材质使用AngryBots里面的LaserDot.mat,材质纹理贴图是LaserDot.psd和SimpleNoise.psd。Shader使用AngryBots里面的LaserScope.shader。这个是射到物体表面时的一个红色的点。

3.创建一个脚本组件PreFrameRaycast挂载在Laser下面,用来发射一条射线,并返回射线的碰撞信息

using UnityEngine;
using System.Collections;
//转载请说明出处public class PreFrameRaycast : MonoBehaviour
{private RaycastHit hitInfo;private Transform tr;// Use this for initializationvoid Start(){}void Awake(){tr = this.transform;}// Update is called once per framevoid Update(){hitInfo = new RaycastHit();Physics.Raycast(tr.position, tr.forward, out hitInfo);Debug.DrawRay(tr.position, tr.forward, Color.red);}//返回射线的碰撞信息public RaycastHit GetHitInfo(){if (hitInfo.Equals(null)){Debug.LogWarning("hitInfo is null");}return hitInfo;}
}

4.创建一个脚本组件pointerCtrl挂载在Laser下面,用来绘制红外射线

 打开pointerCtrl.cs

using UnityEngine;
using System.Collections;
//转载请说明出处
public class pointerCtrl : MonoBehaviour
{public float scrollSpeed = 0.5f;public float pulseSpeed = 1.5f;public float noiseSize = 1.0f;public float maxWidth = 0.5f;public float minWidth = 0.5f;private float aniTime = 0.0f;private float aniDir = 1.0f;private LineRenderer lRenderer;public GameObject pointer = null;  //小红点private PreFrameRaycast raycast;   //光线投射void Start(){lRenderer = gameObject.GetComponent (typeof(LineRenderer)) as LineRenderer;raycast = gameObject.GetComponent(typeof(PreFrameRaycast)) as PreFrameRaycast;// Update is called once per frame
    }void Update(){//光线看起来有动感GetComponent<Renderer>().material.mainTextureOffset += new Vector2(Time.deltaTime * aniDir * scrollSpeed, 0);//设置纹理偏移量GetComponent<Renderer>().material.SetTextureOffset("_NoiseTex", new Vector2(-Time.time * aniDir * scrollSpeed, 0.0f));float aniFactor = Mathf.PingPong(Time.time * pulseSpeed, 1.0f);aniFactor = Mathf.Max(minWidth, aniFactor) * maxWidth;//设置光线的宽
        lRenderer.SetWidth(aniFactor, aniFactor);//光线的起点,枪口的地方lRenderer.SetPosition(0, this.gameObject.transform.position);if (raycast == null){Debug.Log("raycast is null");return;}//获取光线的碰撞信息RaycastHit hitInfo = raycast.GetHitInfo();//光线碰撞到物体if (hitInfo.transform){//光线的终点,即光线的碰撞点lRenderer.SetPosition(1, hitInfo.point);GetComponent<Renderer>().material.mainTextureScale = new Vector2(0.1f * (hitInfo.distance), GetComponent<Renderer>().material.mainTextureScale.y);GetComponent<Renderer>().material.SetTextureScale("_NoiseTex", new Vector2(0.1f * hitInfo.distance * noiseSize, noiseSize));if (pointer){pointer.GetComponent<Renderer>().enabled = true;//pointer.transform.position = hitInfo.point + (transform.position - hitInfo.point) * 0.01f;pointer.transform.position = hitInfo.point;pointer.transform.rotation = Quaternion.LookRotation(hitInfo.normal, transform.up);pointer.transform.eulerAngles = new Vector3(90, pointer.transform.eulerAngles.y, pointer.transform.eulerAngles.z);}}else{    //光线没有碰撞到物体if (pointer){pointer.GetComponent<Renderer>().enabled = false;}//光线的最大长度float maxDist = 200.0f;//当光线没有碰撞到物体,终点就是枪口前方最大距离处lRenderer.SetPosition(1, (this.transform.forward * maxDist));GetComponent<Renderer>().material.mainTextureScale = new Vector2(0.1f * maxDist, GetComponent<Renderer>().material.mainTextureScale.y);GetComponent<Renderer>().material.SetTextureScale("_NoiseTex", new Vector2(0.1f * maxDist * noiseSize, noiseSize));}}
}

5.把这个Laser节点挂在枪的指定位置作为子节点,运行的效果

转载于:https://www.cnblogs.com/HangZhe/p/7419978.html

关于Unity中红外线瞄准的效果实现相关推荐

  1. unity中实现镜子效果

    本文转载自http://blog.csdn.net/zhangxiao13627093203/article/details/52403186 上一篇介绍了有关镜子的制作,有关理论部分的内容我会在后续 ...

  2. Unity中实现粒子效果显示在UI上

    一:为什么默认模式下粒子效果不能显示在UI上 因为Canvas的默认渲染模式是Screen Space-Overlay,这种模式下的Canvas在屏幕空间中渲染,会显示在场景的最上方,也就是说一切UI ...

  3. Unity中实现激光效果——Unique Lasers Volume插件

    一:效果演示 二:介绍 该插件有两个重要脚本:LaserScript和ParticleSystemController FirePoint:该激光的起点(该点建议放在摄像机下.枪口前等) EndPoi ...

  4. 在Unity中模仿游戏《江南百景图》中物体的出现效果

    在Unity中模仿游戏<江南百景图>中物体的出现效果 1. 效果 1.1. 游戏中的效果 1.2. 在Unity中模仿的效果 2. 思路 3. 实现 3.1. 图片 3.2. shader ...

  5. tilemap 导入unity_教程|Unity中使用Tilemap快速创建2D游戏世界

    Custom Tiles Palette包含瀑布瓦片.如果选中瀑布规则瓦片,也就是Waterfall-RuleTile,可以看到它的导出类型为动画(Animate).这样就可以为每个瓦片指定动画帧. ...

  6. Unity中的布料系统

    0. 前言 项目技术测试结束之后,各种美术效果提升的需求逐渐成为后续开发的重点,角色效果部分的提升目标之一便是在角色选择/展示界面为玩家提供更高的品质感,于是可以提供动态效果的布料系统就作为了技术预研 ...

  7. Unity基础:粒子效果面板

    如何在Unity中实现粒子效果? 首先,右键点击 Hierarchy栏,选择effects->Particle System,这样你就新建了一个粒子系统,如图所示: 下面来介绍右侧监视器(Ins ...

  8. Unity中使用模板测试模拟Mask组件效果

    本文分享Unity中使用模板测试模拟Mask组件效果 在上一篇文章中, 我们分享了模板测试的基础知识, 在今天的分享中, 我们会尝试使用模板测试来模拟遮罩效果. Unity中使用模板测试模拟Mask组 ...

  9. 【游戏开发小技】Unity中实现Dota里的角色技能地面贴花效果(URP | ShaderGraph | Decal)

    本文最终效果 文章目录 一.前言 二.环境准备 1.URP环境准备 2.技能范围图案 二.方案一:写Shader实现 1.Shader脚本:UrpDecal.shader 2.材质球 3.创建Cube ...

最新文章

  1. 一.Timesten安装
  2. 笑傲江湖ol更新服务器正在维护,笑傲江湖ol4月22日更新内容 调整死亡复活设置...
  3. Linux使用小于1024的端口号,Linux中如何让普通用户使用小于1024的端口
  4. Android四大组件之BroadCastReceiver
  5. open_links_per_instance 和 open_links 参数说明
  6. 香帅的北大金融学课笔记11 -- 资产配置
  7. 【讨论】初学者拿到2440、6410 等开发板应该怎么学习?
  8. Vue 2.0 + Vue Router + Vuex 后台管理系统的骨架
  9. Ubuntu登录异常: 输入正确的密码, 但是却无法进入系统, 总是返回到登录界面, 但是用ctrl+alt+F1-F文字界面登录都可以进入。
  10. 使用Movavi Video Editor如何做局部放大的影片特效
  11. Qt数据库集成应用封装
  12. oracle密码过期和账户锁定
  13. P2010 [NOIP2016 普及组] 回文日期
  14. HTML元素拖拽功能的实现
  15. Spring Boot基础学习08 - Spring Boot整合Redis
  16. 如何调试Hola Studio
  17. html css支付页面弹出密码框,html5仿支付宝密码框的实现代码
  18. 端午节之苍南懒人游 (*^__^*) ……
  19. 设置网页默认为360浏览器极速模式打开
  20. 利用Google API 进行IP地址定位

热门文章

  1. unity阴影(一)烘焙和Quality中Shadows的设置
  2. UE4运行时虚拟纹理教程【RVT】
  3. unity的静态设置以及烘培属性
  4. 表弟背着我帮同学刷课,一个月赚了1500,这是亲表弟吗?
  5. 消防装备管理系统功能架构概述
  6. matlab构造圆盘,基于matlab的FY-4(全圆盘)影像几何纠正
  7. 北信源网络接入控制管理系统 软件
  8. 3dsmax 模型创建+原生贴图(多图)
  9. Gerber 文件钻孔(过孔)偏移的问题解决办法
  10. 厦门大学计算机科学与技术学院官网,厦门大学和东南大学哪个更强?你会怎么选择...