今天做一个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中红外线瞄准的效果实现的更多相关文章

  1. Unity中做放大镜 效果

    孙广东  2015.8.16 事实上和 小地图都几乎相同了. 还是要借助 还有一个相机 目的: 这篇文章的主要目的是  要给你一个想法  怎样做放大境效果 . 在unity中能够简单的实现放大镜效果啊 ...

  2. Unity中实现网格轮廓效果,选中边框效果

    问题背景: 最近要实现选中实体的高亮效果,要那种类似于unity中Outline的效果,网格轮廓高亮效果. 效果图: 具体代码: OutlineEffect.cs 实体高亮效果类: 轮廓边总控制类,该 ...

  3. Unity中利用柏林噪声(perlinnoise)制作摇摆效果

    perlinnoise是unity中Mathf下的一个函数,需要两个float参数x和y进行采样,返回一个0-1的float型. 项目里经常要随机摇摆某些东西,比如摄像机,某个随机运动的目标等等,都可 ...

  4. unity 中UGUI制作滚动条视图效果(按钮)

    1.在unity中创建一个Image作为滚动条视图的背景: 2.在Image下创建一个空物体,在空物体下创建unity自带的Scroll View组件: 3.对滑动条视图的子物体进行调整: 4.添加滚 ...

  5. 在Unity中使用UGUI修改Mesh绘制几何图形

    在商店看到这样一个例子,表示很有兴趣,他们说是用UGUI做的.我想,像这种可以随便变形的图形,我第一个就想到了网格变形. 做法1: 细心的朋友应该会发现,每个UGUI可见元素,都有一个‘Canvas ...

  6. 【unity shaders】:Unity中的Shader及其基本框架

    shader和Material的基本关系 Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这个输出来将图 ...

  7. 解读Unity中的CG编写Shader系列八(镜面反射)

    转自http://www.itnose.net/detail/6117378.html 讨论完漫反射之后,接下来肯定就是镜面反射了 在开始镜面反射shader的coding之前,要扩充一下前面提到的知 ...

  8. 解读Unity中的CG编写Shader系列三

    转自http://www.itnose.net/detail/6096068.html 在上一个例子中,我们得到了由mesh组件传递的信息经过数学转换至合适的颜色区间以颜色的形式着色到物体上.这篇文章 ...

  9. 关于Unity中Camera的Aspect

    一直以来对Camera的Aspect和Game窗口的Aspect都是一知半解,某天从一本书中看到了对Camera的API讲解,但是总觉得对Aspect讲解的有问题.于是就认真的思考起了这个问题,还发现 ...

随机推荐

  1. LeetCode——4Sum &amp; 总结

    LeetCode--4Sum & 总结 前言 有人对 Leetcode 上 2Sum,3Sum,4Sum,K Sum问题作了总结: http://blog.csdn.net/nanjunxia ...

  2. GPG key retrieval failed

    Total size: 340 k Installed size: 1.2 M Is this ok [y/N]: y Downloading Packages: warning: rpmts_Hdr ...

  3. 菜鸟学SSH(七)——Spring jar包详解

    Struts.Hibernate.Spring这类的框架给我们开发带来非常大的好处,让我们更加快速.有效的开发.所以我们在开发中通常都会用到各种框架,每个框架都有很多jar包,每个jar都有各自不同的 ...

  4. C语言发展历程及其保留字(关键字)——附:C语言标准文档

    引言         抽时间对C语言发展历程和C语言的标准库文件及其保留字/关键字做了个梳理,后面附C语言各版本国际标准. C语言发展历程及其标准库 C语言关键字/保留字 C语言国际标准       ...

  5. Python 3.6 安装pip

    1.首先python3.4以后,pip内嵌,不过使用方法是: python -m pip install django 2.如果你觉得上面的指令太长,想用旧方法使用pip,那用以下指令安装pip即可 ...

  6. Capterra Software Categories

    https://www.capterra.com/categories this software categories is valuable.

  7. numpy数组-标准化数据

    标准化数据的公式: (数据值 - 平均数) / 标准差 import numpy as np employment = np.array([ 55.70000076, 51.40000153, 50. ...

  8. 【web技术】html特效代码(二)

    html特效代码(一) html特效代码(二) 图片漂浮广告代码 <bodybgcolor="#F7F7F7"> <!--图片漂浮广告代码开始--> < ...

  9. APT典型应用示例

    Ubuntu下的APT(Advanced Packaging Tools,高级软件包管理工具)是用于在Ubuntu下用于软件安装.升级.维护的工具.注意运行apt指令需要root权限. 下面是一个简单 ...

  10. django模型查询

    概述 查询集表示从数据库获取的对象的集合 查询集可以有多个过滤器 过滤器就是一个函数,基于所给的参数限制查询集结果 从SQL角度来说,查询集和select语句等价,过滤器就像where条件 查询集 在 ...