unity shader forge人物被遮挡的半透明shader人物自己把自己挡住怎么解决

2550人阅读
比如有两个tube :A,B
B在A的后面(在unity视坐标系是Z大的在后面,注意分清视坐标系和世界坐标系,Z缓存中是视坐标系),
比如我希望B的tex是c,但是B被A遮挡的部分显示tex d或其他效果(可自己定)
我的方法是绘制顺序必须最后画B
A材质上的shader为直接,settexture,但是queue需要设置为靠前的,比如background等
Shader&&Custom/Nothing&&{
&&&&Properties&{
&&&&&&&&_MainTex&(&Base&(RGB)&,&2D)&=&&white&&{}
&&&&&&&&//_OtherTex(&Other&&,2D)=&&white&{}
&&&&SubShader{
&&&&Tags{&Queue&=&Background&}
&&&&//&&&&Pass{
&&&&//&&&&SetTexture[_MainTex]{
&&&&//&&&&combine&texture
&&&&//&&&&}
&&&&&&&&//ZWrite&On
&&&&&&&&//ZTest&Less
&&&&&&&&SetTexture[_MainTex]{
&&&&&&&&//constantColor(0.5,0,0.5,0)
&&&&&&&&combine&texture//constant&lerp(texture)&texture
&&&&//&&&&Pass{
&&&&//&&&&ZWrite&On
&&&&//&&&&ZTest&LEqual
&&&&//&&&&SetTexture&[_MainTex]{
&&&&//&&&&combine&texture
&&&&//&&&&}
&&&&//&&&&}
然后是B材质上的shader:
Shader&&Custom/NewShader&&{
&&&&Properties&{
&&&&&&&&_MainTex&(&Base&(RGB)&,&2D)&=&&white&&{}
&&&&&&&&_OtherTex(&Other&&,2D)=&&white&{}
&&&&SubShader&{
&&&&Tags{&Queue&=&Opaque&}
&&&&//&&&&Pass{
&&&&//&&&&ZWrite&On
&&&&//&&&&ZTest&Greater
&&&&//&&&&SetTexture[_OtherTex]{
&&&&//&&&&combine&texture
&&&&//&&&&}
&&&&//&&&&}
&&&&&&&&Pass{
&&&&&&&&ZWrite&Off
&&&&&&&&ZTest&Greater
&&&&&&&&SetTexture[_MainTex]{
&&&&&&&&constantColor(0.3,0.3,0.3,1)
&&&&&&&&//combine&texture//&lerp(texture)&previous
&&&&&&&&combine&texture*constant
&&&&&&&&Pass{
&&&&&&&&ZWrite&On
&&&&&&&&ZTest&LEqual
&&&&&&&&SetTexture&[_MainTex]{
&&&&&&&&combine&texture
这种方法在2D中可能要设置Offset,
在物体多时注意把被遮挡物体群的 &Queue&=&AlphaTest&,场景中遮挡物体的Queue设到不后于AlphaTest。。。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:76558次
积分:1330
积分:1330
排名:千里之外
原创:50篇
转载:29篇
(1)(2)(3)(1)(3)(2)(1)(9)(1)(1)(9)(4)(5)(5)(6)(9)(11)(12)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'要实现角色被遮挡的部分显示半透明。下面是用到的Shader
Shader &Custom/PlayerDiffuse& {
Properties {
_NotVisibleColor (&NotVisibleColor (RGB)&, Color) = (0.3,0.3,0.3,1)
_MainTex (&Base (RGB)&, 2D) = &white& {}
SubShader {
Tags { &Queue& = &Geometry+500& &RenderType&=&Opaque& }
ZTest Greater
Lighting Off
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
Color [_NotVisibleColor]
ZTest LEqual
SetTexture [_MainTex] { combine texture }
FallBack &Diffuse&
本文已收录于以下专栏:
相关文章推荐
unity shaderlab 的语法基础 ,用来做个人备忘查询
ShaderLab Syntax
Unity中的所有Shader都是用一种叫做&Shader Lab&的陈述性语言(declara...
上面的shader需要设置在水上面
除了设置上面的shader,还需要将Camera的深度模式设置为depth
GetComponent ().depthTextureMode = DepthText...
欢迎来到unity学习、unity培训、unity企业培训教育专区,这里有很多U3D资源、U3D培训视频、U3D教程、U3D常见问题、U3D项目源码,【狗刨学习网】unity极致学院,致力于打造业内u...
【Unity3D实战】RPG黑暗之光:游戏分解及各系统的实现
一、任务系统:
1、添加接任务的老爷爷:
Model中选择并添加老爷爷,调整方向,并添加一个Box collider组件。
...
《火炬之光》貌似是最近挺惹人注目的游戏了。我所高兴的是这个游戏是Ogre做的,那么按老外的习惯,里面的模型材质纹理等都是暴露的了。下了一个果不其然。不过真正让我注目的是,这款游戏确实挺不错,一个非商业...
漫反射原理解析众所周知,漫反射即光线射到粗糙的物体表面时发生的反射现象,入射光线为平行光线,而出射光线为各个方向。光在空气中以直线传播,光线的反射也遵守物理规则。
【Unity3D】RPG黑暗之光Scene1:创建开始场景
1、导入资地形、地貌资源,新建场景,导入地形、地貌prefab,设置相机位置,添加全局灯光。
2、设置鼠标指针图片:
Edit--&P...
整个学习目录如下所示
课时01_游戏预览和介绍
课时02_导入场景资源,搭建场景
课时03_给场景添加光,设置鼠标指针图片
课时04_给场景添加水面和天空盒子
课时05_实现镜头缓慢拉近的效...
角色的移动分为两步实现:①角色的移动;②角色播放移动动画。
一、角色的移动
前期工程已经实现了朝向点击方向,则现在只需要让角色向前移动即可。脚本如下:
private CharacterCont...
现需要完成镜头的跟随及控制。
一、镜头的跟随
思路很简单,首先取得镜头初始与角色的距离向量值,然后让相机与角色持续保持该向量距离即可。脚本如下:
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)博客数据丢失,刚恢复一年前的备份!--QQ群:
如上图。我们通过射线。获取遮挡物。然后将遮挡物的shader替换。或者直接修改遮挡物的材质。实现半透效果。
具体代码如下
using UnityE
using System.C
using System.Collections.G
public class MyCamera : MonoBehaviour
////本次碰撞到的物体
private List&Renderer& colliderO
//得到主人公
public GameObject T
void Start()
colliderObject = new List&Renderer&();
void Update()
//绘制射线为红色。方便调试
Debug.DrawLine(Target.transform.position, transform.position, Color.red);
RaycastHit[]
hit = Physics.RaycastAll(Target.transform.position, transform.position);
if (hit.Length & 0)
for (int i = 0; i & hit.L i++)
//Debug.LogWarning("有碰撞" + hit[i].collider.gameObject.name);
Renderer obj = hit[i].collider.gameObject.GetComponent&Renderer&();
colliderObject.Add(obj);
SetMaterialsColor(obj, 0.5f);
for (int i = 0; i & colliderObject.C i++)
Renderer obj = colliderObject[i];
SetMaterialsColor(obj, 1f);
/// &summary&
/// 修改遮挡物体所有材质
/// &/summary&
/// &param name="_renderer"&材质&/param&
/// &param name="Transpa"&透明度&/param&
private void SetMaterialsColor(Renderer _renderer, float Transpa)
//换shader或者修改材质
//获取当前物体材质球数量
int materialsNumber = _renderer.sharedMaterials.L
for (int i = 0; i & materialsN i++)
//获取当前材质球颜色
Color color = _renderer.materials[i].
//设置透明度
0 = 完全透明
color.a = T
//置当前材质球颜色
_renderer.materials[i].SetColor("_Color", color);
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
using UnityEngine;using System.Collections;using System.Collections.Generic;&public class MyCamera : MonoBehaviour{&&&&////本次碰撞到的物体&&&&private List&Renderer& colliderObject;&&&&&//得到主人公&&&&public GameObject Target;&&&&void Start()&&&&{&&&&&&&&colliderObject = new List&Renderer&();&&&&&}&&&&void Update()&&&&{&&&&&&&&//绘制射线为红色。方便调试&&&&&&&&Debug.DrawLine(Target.transform.position, transform.position, Color.red);&&&&&&&&RaycastHit[] hit;&&&&&&&&&hit = Physics.RaycastAll(Target.transform.position, transform.position);&&&&&&&&if (hit.Length & 0)&&&&&&&&{&&&&&&&&&&&&&for (int i = 0; i & hit.Length; i++)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&//Debug.LogWarning("有碰撞" + hit[i].collider.gameObject.name);&&&&&&&&&&&&&&&&Renderer obj = hit[i].collider.gameObject.GetComponent&Renderer&();&&&&&&&&&&&&&&&&colliderObject.Add(obj);&&&&&&&&&&&&&&&&SetMaterialsColor(obj, 0.5f);&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&}//还原&&&&&&&&else&&&&&&&&{&&&&&&&&&&&&&for (int i = 0; i & colliderObject.Count; i++)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&Renderer obj = colliderObject[i];&&&&&&&&&&&&&&&&SetMaterialsColor(obj, 1f);&&&&&&&&&&&&}&&&&&&&&}&&&&&}&&&&/// &summary&&&&&/// 修改遮挡物体所有材质&&&&/// &/summary&&&&&/// &param name="_renderer"&材质&/param&&&&&/// &param name="Transpa"&透明度&/param&&&&&private void SetMaterialsColor(Renderer _renderer, float Transpa)&&&&{&&&&&&&&//换shader或者修改材质&&&&&&&&&//获取当前物体材质球数量&&&&&&&&int materialsNumber = _renderer.sharedMaterials.Length;&&&&&&&&for (int i = 0; i & materialsNumber; i++)&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&//获取当前材质球颜色&&&&&&&&&&&&Color color = _renderer.materials[i].color;&&&&&&&&&&&&&//设置透明度&&0-1;&&0 = 完全透明&&&&&&&&&&&&color.a = Transpa;&&&&&&&&&&&&&//置当前材质球颜色&&&&&&&&&&&&_renderer.materials[i].SetColor("_Color", color);&&&&&&&&}&&&&&}}
另。默认的cube等需要自己设置一个材质。添加一个shader。如下
另。如果要获取一个范围而不是一条射线上的。可以用如下代码。
Physics.SphereCastAll(Target.transform.position,0.5f, transform.position);
Physics.SphereCastAll(Target.transform.position,0.5f, transform.position);
效果如上。射线并没有直接射中物体。但是也被检测到了。
转载请注明: &
or分享 (0)
本站所有内容如未标明转载的内容,均为原创内容。转载请注明来源!2536人阅读
【Unity】(101)
【Shader】(4)
【效果】(11)
using UnityE
using System.C
using System.Collections.G
/// &summary&
/// 脚本功能:当人物主角被障碍物遮挡的时候(从摄像机视角看去),使障碍物半透明化,当主角可见时,恢复障碍物透明度
/// 脚本位置:MainCamera 或者任意一个可以始终存在的游戏对象身上即可
/// 创建时间:日
/// 障碍物Shader使用的是Unity内置的Standard
/// Rendering Mode选择Transparent模式
/// &/summary&
public class Obstacle2transparente : MonoBehaviour {
// 所有障碍物的Renderer数组
private List&Renderer& _ObstacleC
// 人物主角(之后通过名字识别?还是tag?目前手动拖过来)
public GameObject _
// 临时接收,用于存储
private Renderer _tempR
void Start()
_ObstacleCollider = new List&Renderer&();
void Update()
// 调试使用:红色射线,仅Scene场景可见
#if UNITY_EDITOR
Debug.DrawLine(_target.transform.position, transform.position, Color.red);
RaycastHit[]
hit = Physics.RaycastAll(_target.transform.position, transform.position);
如果碰撞信息数量大于0条
if (hit.Length & 0)
// 设置障碍物透明度为0.5
for (int i = 0; i & hit.L i++)
_tempRenderer = hit[i].collider.gameObject.GetComponent&Renderer&();
_ObstacleCollider.Add(_tempRenderer);
SetMaterialsAlpha(_tempRenderer, 0.5f);
Debug.Log(hit[i].collider.name);
}// 恢复障碍物透明度为1
for (int i = 0; i & _ObstacleCollider.C i++)
_tempRenderer = _ObstacleCollider[i];
SetMaterialsAlpha(_tempRenderer, 1f);
// 修改障碍物的透明度
private void SetMaterialsAlpha(Renderer _renderer, float Transpa)
// 一个游戏物体的某个部分都可以有多个材质球
int materialsCount = _renderer.materials.L
for (int i = 0; i & materialsC i++)
// 获取当前材质球颜色
Color color = _renderer.materials[i].
// 设置透明度(0--1)
color.a = T
// 设置当前材质球颜色(游戏物体上右键SelectShader可以看见属性名字为_Color)
_renderer.materials[i].SetColor(&_Color&, color);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:935184次
积分:17843
积分:17843
排名:第558名
原创:180篇
转载:10篇
评论:50条
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 unity3d shader教程 的文章

 

随机推荐