关于Unity中红外线瞄准的效果实现
今天做一个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 initialization
void Start()
{ } void Awake()
{
tr = this.transform;
} // Update is called once per frame
void 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, );
//设置纹理偏移量
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(, this.gameObject.transform.position);
if (raycast == null)
{
Debug.Log("raycast is null");
return;
}
//获取光线的碰撞信息
RaycastHit hitInfo = raycast.GetHitInfo();
//光线碰撞到物体
if (hitInfo.transform)
{
//光线的终点,即光线的碰撞点
lRenderer.SetPosition(, 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(, pointer.transform.eulerAngles.y, pointer.transform.eulerAngles.z);
}
}
else
{ //光线没有碰撞到物体
if (pointer)
{
pointer.GetComponent<Renderer>().enabled = false;
}
//光线的最大长度
float maxDist = 200.0f;
//当光线没有碰撞到物体,终点就是枪口前方最大距离处
lRenderer.SetPosition(, (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节点挂在枪的指定位置作为子节点,运行的效果

关于Unity中红外线瞄准的效果实现的更多相关文章
- Unity中做放大镜 效果
孙广东 2015.8.16 事实上和 小地图都几乎相同了. 还是要借助 还有一个相机 目的: 这篇文章的主要目的是 要给你一个想法 怎样做放大境效果 . 在unity中能够简单的实现放大镜效果啊 ...
- Unity中实现网格轮廓效果,选中边框效果
问题背景: 最近要实现选中实体的高亮效果,要那种类似于unity中Outline的效果,网格轮廓高亮效果. 效果图: 具体代码: OutlineEffect.cs 实体高亮效果类: 轮廓边总控制类,该 ...
- Unity中利用柏林噪声(perlinnoise)制作摇摆效果
perlinnoise是unity中Mathf下的一个函数,需要两个float参数x和y进行采样,返回一个0-1的float型. 项目里经常要随机摇摆某些东西,比如摄像机,某个随机运动的目标等等,都可 ...
- unity 中UGUI制作滚动条视图效果(按钮)
1.在unity中创建一个Image作为滚动条视图的背景: 2.在Image下创建一个空物体,在空物体下创建unity自带的Scroll View组件: 3.对滑动条视图的子物体进行调整: 4.添加滚 ...
- 在Unity中使用UGUI修改Mesh绘制几何图形
在商店看到这样一个例子,表示很有兴趣,他们说是用UGUI做的.我想,像这种可以随便变形的图形,我第一个就想到了网格变形. 做法1: 细心的朋友应该会发现,每个UGUI可见元素,都有一个‘Canvas ...
- 【unity shaders】:Unity中的Shader及其基本框架
shader和Material的基本关系 Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这个输出来将图 ...
- 解读Unity中的CG编写Shader系列八(镜面反射)
转自http://www.itnose.net/detail/6117378.html 讨论完漫反射之后,接下来肯定就是镜面反射了 在开始镜面反射shader的coding之前,要扩充一下前面提到的知 ...
- 解读Unity中的CG编写Shader系列三
转自http://www.itnose.net/detail/6096068.html 在上一个例子中,我们得到了由mesh组件传递的信息经过数学转换至合适的颜色区间以颜色的形式着色到物体上.这篇文章 ...
- 关于Unity中Camera的Aspect
一直以来对Camera的Aspect和Game窗口的Aspect都是一知半解,某天从一本书中看到了对Camera的API讲解,但是总觉得对Aspect讲解的有问题.于是就认真的思考起了这个问题,还发现 ...
随机推荐
- [nginx]盗链和防盗链场景模拟实现
盗链环境模拟 http://www.daolian.com/index.html 这个页面盗用http://www.maotai.com/qq.jpg这个站点页面的图. <!doctype ht ...
- python细节问题
1.list添加元素 a = [1, 2] print(id(a)) a += [3] print(id(a)) a = a + [4] print(id(a)) a.append(5) print( ...
- git命令(10):git 常用操作,撤销修改(2)
一. 创建与合并分支 1. 从master分支创建dev分支并切换到dev分支: git checkout master git checkout -b dev 其中,git checkout -b ...
- 【delphi】Byte数组与String类型的转换
string string = AnsiString = 长字符串,理论上长度不受限制,但其实受限于最大寻址范围2的32次方=4G字节: 变量Str名字是一个指针,指向位于堆内存的字符序列,字符序列起 ...
- 【delphi】多线程与多线程同步
在 Delphi 中使用多线程有两种方法: 调用 API.使用 TThread 类; 使用 API 的代码更简单. CreateThread function CreateThread( lpThre ...
- ASP.NET MVC@model多个对象
需求:同时查看一个产品信息和发布会员的信息 方案1:新建ViewModel 方案2:ViewData.ViewBag 方案3:Tuple<obj1,obj2> 在这里我们使用方案3来实现这 ...
- ubuntu 解压命令
ubuntu解压命令.tar解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)———————————————. ...
- 完美解决苹果电脑mac终端无法输入大写T的问题
[本文出自天外归云的博客园] 最近突然发现我的苹果电脑mac终端无法输入大写字母T,今天终于在同事的帮助下解决了!之前在网上查解决方法,感觉步骤描述欠佳!今天记录一下这个踩坑经验: 完美解决! 首先打 ...
- eclipse中git更新操作
1,本地已经修改的代码不要commit和push 2,选中工程,右击Team,然后点击Fetch from Upstream,从远程服务器拉取最新的代码 3,上一步操作完成,再右击工程,选中Team, ...
- FastText算法原理解析
1. 前言 自然语言处理(NLP)是机器学习,人工智能中的一个重要领域.文本表达是 NLP中的基础技术,文本分类则是 NLP 的重要应用.fasttext是facebook开源的一个词向量与文本分类工 ...