求大神把毛不易歌曲下载的歌曲发邮箱247340226@qq.com 很喜欢万分谢谢

最近看到一个非常有趣的益智小游戏,是一个盗贼进入房子偷东西的,
其实这种游戏市面上已经很多了,吸引我的是那个类似手电筒的效果,
主角走到哪里,光就到哪里,被挡住的地方还有阴影。有点类似策略游戏里的战争迷雾。
绞尽脑汁想了一天,终于实现类似的效果,这就给大家分享下。
实现这个效果用到的技术:
1.Shader实现摄影机透明穿透效果(光照的实现)
2.代码里动态改变mesh(阴影形状的实现)
废话不多说,动手。
--------------------------------------------------------------------------------------------
仔细观察可以看出,没被光照到的地方是灰色的,照到的地方是彩色的,而且被光照到的地方,
不仅能显示出被光照到后的效果(彩色地面),还能显示出一些物品,比如钥匙,敌人等。
由此可推测,这场景应该是两个层组成的,一个层在下,是彩色地面以及敌人等要隐藏的物品,
另一个层在上,是没有被照亮的时候的地图,然后根据光线进行裁剪,光线能到达的地方,就把
上层该地方裁剪掉,露出底下部分,从而实现“照亮”的效果。
因此我们先按照这种思路搭载场景:
1.题目说的是2D游戏,我这里弄成3D的,其实都所谓,最终的视觉是俯视的,其实也跟2D一样,这里弄成这个角度是方便大家识别我的层次。
Up就是上层,其实什么都没有,就只有一张没被光照的时候的贴图(我这里偷懒直接用一片灰色代替了)
Down就是下层,这里把几乎所有元素都放满了,玩家,敌人,墙等
2.接下来将各种类型的对象放到相应的层里去,方便相机筛选(这里的层跟上面提到的层不一样,这里的层是Unity里的定义)
这里我为了方便大家识别,为一种类型的对象设置一个层,实际操作肯定不会这样繁琐的操作的,没必要。
3.创建两个相机,让它们分别显示对于的层。
(先无视Mask,这个待会再讲)
如果设置正确,你的显示应该跟我上图是一样的,并且把Up相机的Depth级别设置高点,让它显示在Down相机之前。
4.遮挡上层,显示下层。
就是这么个原理
具体至于要怎么遮挡?我一开始想到的是UGUI的Mask组件,后来想想,这个Mask是固定的一张图片,那么只能显示固定的遮挡(虽然可以动态更改,但较麻烦),
后来想,那么就通过网格遮挡,毕竟网格动态改变形状很容易,而且可以通过Shader轻易地实现遮挡效果。
具体如下,先写这么一个Shader:
Shader &Masked/Mask& {
SubShader {
// Render the mask after regular geometry, but before masked geometry and
// transparent things.
Tags {&Queue& = &Geometry+10& }
// Don't draw in the RGBA just the depth buffer
ColorMask 0
// Do nothing specific in the pass:
如果你懂Shader那么一眼就可以看懂它,不懂也无所谓,直接Copy进去。
它其实就是让你的网格变成一个遮挡物,摄影机一看到这个网格,就会直接穿透过去,直接看到背景。
然后添加一个GameObject,并添加MeshFilter以及MeshRender组件,并且赋予这个Shader,作为Mask。
如果你这个Mask当前的Mesh不为空的话,你可以很直观地看到它所在的地方都不会被摄影机渲染出来,
直接变成一个穿透的洞:
它不仅是透明的,还是异次元洞,就算它身后的东西也显示不出来,直接就看到背景了。
竟然它直接穿透到背景,那么看到看不到底层,那么我们要它何用呢?
对,它只是将当期摄影机穿透到背景,所以我们将当期摄影机的Clear Flags设置为“Depth Only&,这样第一个摄影机
的背景将显示第二个摄影机的内容。这样就可以轻易达到我们想要的穿透。
5.遮挡实现了,那么该如何实现动态光照变化呢?
我这里使用的是RayCast,以主角为原点,向四周辐射一定量的射线,这样可以模拟光照,
然后根据射线探测到的点组合成上面提到的遮挡物的网格。最终就达到我们想要的效果。
using UnityE
public class FOVMesh : MonoBehaviour
public GameObject playerGameO
// 光照半径
public float range = 3;
// 光照质量,数值越低,向四周辐射的射线越多,效果越好,但性能越低
public int levelOfDetails = 1;
// 接受光照产生阴影的对象
public LayerMask[] layerM
private Vector3
private int index = 0;
private int triIndex = 0;
private int lod = 1;
private GameO
private GameObject pGo;
private Vector3 worldP
private Vector3[]
private int[]
private Vector2[]
private GameObject didH
// Code that runs on entering the state.
public void Start ()
go = gameO
pGo = playerGameO
mesh = new Mesh ();
go.GetComponent&MeshFilter& ().mesh =
lod = levelOfD
// 若loa为1,则共发射360条射线作为光线,则有360个顶点加个圆心
verts = new Vector3[(360 / lod) + 1];
// 每两个顶点跟圆心组成一个三角形,所以三角形的个数为定点数乘3
tris = new int[(360 / lod) * 3];
uvs = new Vector2[verts.Length];
for (int i = 0; i & layerMask.L ++i) {
mask |= layerMask [i];
// Code that runs every frame.
public void Update ()
index = 0;
triIndex = 0;
worldPos = pGo.transform.
verts [index] = worldP
for (var a=0; a&360; a += lod) {
var direction = new Vector3 (Mathf.Sin (Mathf.Deg2Rad * a), 0, Mathf.Cos (Mathf.Deg2Rad * a));
direction = direction *
if (Physics.Raycast (worldPos, direction, out hit, width, mask)) {
// 如果被射线探中,则将探测到的点作为网格的顶点
verts [index] = new Vector3 (hit.point.x, hit.point.y, hit.point.z);
// 否则将射线的末端作为网格的顶点
verts [index] = new Vector3 (direction.x + worldPos.x, worldPos.y, direction.z + worldPos.z);
// 根据网格顶点组合三角形
for (var i=1; i&(360/lod); i++) {
tris [triIndex] = 0;
tris [triIndex + 1] =
tris [triIndex + 2] = i + 1;
triIndex += 3;
tris [((360 / lod) * 3) - 3] = 0;
tris [((360 / lod) * 3) - 2] = 360 /
tris [((360 / lod) * 3) - 1] = 1;
// 网格贴图
int j = 0;
while (j & uvs.Length) {
uvs [j] = new Vector2 (verts [j].x, verts [j].z);
// 重新组合网格
mesh.Clear ();
mesh.vertices =
mesh.triangles =
mesh.RecalculateNormals ();
最终效果如图:一种基于低空运动平台的人体动态阴影检测方法_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
一种基于低空运动平台的人体动态阴影检测方法
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩5页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢Unity3D(171)
一般实时阴影主要还在出现在角色、怪物的脚底为了然场景表现的更加逼真,实现起来通常有三种方式:脚底放个阴影图片跟着主角动,通过摄像机的RenderRexture绘制显示,直接使用Unity的Projector组件。 很不幸的是在我们的游戏中直截了当的放了一坨灰背景,实现的效果虽然少了几分逼真性,但如果是2D场景的话也足够用了。
但是如果想要在3D场景绘制脚底阴影,直接放图有点粗暴。本文里的RenderTexture方式实现较为简单效果也会很逼真。
基本思路其实就是多用了一个摄像机,将照相机把你需要照到的主角的内容呈现到一张单独的面片上,这个面片就摆在人较低作为它的阴影。看起来像简单版的一个小地图:只有主角的小地图。
场景中所需要的对象如图,对于map节点显示RenderTexteure的地方只要空的材质球就行了,要呈现摄像机照射的内容。直接用Plane对象或Quad对象都可以的。
此外,为了让阴影真实点,显示阴影的面片一般是灰色透明的,我们还要单独设置下,不然默认摄像机照出来的角色就是我们真实看到的世界:
紧接着还需要一个脚本告诉摄像机把内容写到我们的map面片上。
在场景中的display节点身上绑定脚本ShadowScript:
public class ShadowScript : MonoBehaviour {
public GameO //角色形象
private GameObject ShadowC
private GameO
private RenderTexture mTex = //即为显示阴影的RenderTexutre
public int AntiAliasing = 4;
// Use this for initialization
void Start () {
child = this.transform.FindChild(“qiangu1”);
map = child.FindChild(“child/map”).gameO
ShadowCamera = child.FindChild(“child/camera”).gameO
if (!display)
display = this.transform.parent.gameO
mTex = new RenderTexture(, 0);
mTex.name = “Shadow” + GetInstanceID();
Camera mCamera = ShadowCamera.GetComponent&Camera&();
mCamera.cullingMask = GetLayerMask(display.gameObject.layer);
mCamera.targetTexture = mT
public LayerMask GetLayerMask(int layer)
LayerMask mask = 0;
mask |= 1 &&
// Update is called once per frame
void Update ()
if(display!=null)
mTex.anisoLevel = AntiA
map.renderer.maternTexture = mT
很简单吧?跑起来直接就可以看到实时的阴影效果了!!
自己给小骨模型做了一个御剑的动画!!然而一时找不到好看的剑模型,我只好找了张jpg的剑扣一个出来,也是大费周折,不过可以看出来阴影效果比较好,因为阴影作为一个独立的GameObject直接少了很多调层级的麻烦,现在是只显示主角阴影的效果。
但是当我把剑贴图所在的面片layer调整的也和主角模型一样的时候,发现居然还是看不到剑的阴影。
这个时候还对专门针对map(显示阴影的面片)材质写一个Shader,就不能用默认的Transparent/Diffuse了,并且最终剑这种透明贴图的还需要使用Unlit/Transparent,新添加的Shader详细代码如下:
修改之后靓丽的运行效果:
///作为带Alpha通道的模型贴图的shader
Shader “MyShader/AlphaSkinShader”
Properties
_Color(“Main Color”,Color)=(1,1,1,1)
_MainTex (“Base (RGB)”, 2D) = “white” {}
_Cutoff(“Base Alpha cutoff”,Range(0,0.9))=0.2
Tags { “Queue”=“Transparent” }
Lighting Off
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
#pragma vertex vert
#pragma fragment frag
#include “UnityCG.cginc”
struct appdata_t
float4 vertex:POSITION;
float4 color:COLOR;
float2 texcoord:TEXCOORD;
struct v2f
float4 vertex:SV_POSITION;
float4 color:COLOR;
float2 texcoord:TEXCOORD;
sampler2D _MainT
float4 _MainTex_ST;
v2f vert(appdata_t v)
o.vertex = mul(UNITY_MATRIX_MVP,v.vertex);
o.color=v.
o.texcoord=TRANSFORM_TEX(v.texcoord,_MainTex);
half4 frag(v2f i):SV_Target
half4 col = tex2D(_MainTex,i.texcoord);
if(col.a&_Cutoff)
clip(col.a-_Cutoff);
col.rgb=col.rgb*float3(0,0,0);
col.rgb=col.rgb+_C
col.a=_Color.a;
FallBack “Diffuse”
原文地址:http://www./3641.html
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:283811次
积分:4541
积分:4541
排名:第5240名
原创:37篇
转载:845篇
评论:37条
(8)(5)(2)(26)(8)(16)(25)(16)(27)(17)(40)(27)(13)(29)(57)(57)(86)(86)(60)(57)(40)(30)(54)(36)(11)(16)(3)(4)(9)(12)(17)}

我要回帖

更多关于 毛不易歌曲抄袭花粥 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信