unity3d 角色死亡_unity3d死亡 - CSDN

万次阅读 多人点赞 2017-05-22 00:23:30
简介

基本溶解效果

简单的原理解释完了，先来一发基本的溶解效果：
//溶解效果
//by：puppet_master
//2017.5.18

{
Properties{
_Diffuse("Diffuse", Color) = (1,1,1,1)
_MainTex("Base 2D", 2D) = "white"{}
_DissolveMap("DissolveMap", 2D) = "white"{}
_DissolveThreshold("DissolveThreshold", Range(0,1)) = 0
}

CGINCLUDE
#include "Lighting.cginc"
uniform fixed4 _Diffuse;
uniform sampler2D _MainTex;
uniform float4 _MainTex_ST;
uniform sampler2D _DissolveMap;
uniform float _DissolveThreshold;

struct v2f
{
float4 pos : SV_POSITION;
float3 worldNormal : TEXCOORD0;
float2 uv : TEXCOORD1;
};

v2f vert(appdata_base v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);
return o;
}

fixed4 frag(v2f i) : SV_Target
{
//采样Dissolve Map
fixed4 dissolveValue = tex2D(_DissolveMap, i.uv);
if (dissolveValue.r < _DissolveThreshold)
{
}
//Diffuse + Ambient光照计算
fixed3 worldNormal = normalize(i.worldNormal);
fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
fixed3 lambert = saturate(dot(worldNormal, worldLightDir));
fixed3 albedo = lambert * _Diffuse.xyz * _LightColor0.xyz + UNITY_LIGHTMODEL_AMBIENT.xyz;
fixed3 color = tex2D(_MainTex, i.uv).rgb * albedo;
return fixed4(color, 1);
}
ENDCG

{
Tags{ "RenderType" = "Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
ENDCG
}
}
FallBack "Diffuse"
}
最近找了个比较帅气的模型，先爆个照（开启了Bloom和Depth
Of Field）：

然后，让偶们把它溶解掉，这里我们直接使用了一张噪声图，最简单的雪花点的那种就可以啦，逐渐调大Dissolve Threshold，就可以了：

增加过渡的溶解效果

//溶解效果
//by：puppet_master
//2017.5.18

{
Properties{
_Diffuse("Diffuse", Color) = (1,1,1,1)
_DissolveColorA("Dissolve Color A", Color) = (0,0,0,0)
_DissolveColorB("Dissolve Color B", Color) = (1,1,1,1)
_MainTex("Base 2D", 2D) = "white"{}
_DissolveMap("DissolveMap", 2D) = "white"{}
_DissolveThreshold("DissolveThreshold", Range(0,1)) = 0
_ColorFactorA("ColorFactorA", Range(0,1)) = 0.7
_ColorFactorB("ColorFactorB", Range(0,1)) = 0.8
}

CGINCLUDE
#include "Lighting.cginc"
uniform fixed4 _Diffuse;
uniform fixed4 _DissolveColorA;
uniform fixed4 _DissolveColorB;
uniform sampler2D _MainTex;
uniform float4 _MainTex_ST;
uniform sampler2D _DissolveMap;
uniform float _DissolveThreshold;
uniform float _ColorFactorA;
uniform float _ColorFactorB;

struct v2f
{
float4 pos : SV_POSITION;
float3 worldNormal : TEXCOORD0;
float2 uv : TEXCOORD1;
};

v2f vert(appdata_base v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);
return o;
}

fixed4 frag(v2f i) : SV_Target
{
//采样Dissolve Map
fixed4 dissolveValue = tex2D(_DissolveMap, i.uv);
if (dissolveValue.r < _DissolveThreshold)
{
}
//Diffuse + Ambient光照计算
fixed3 worldNormal = normalize(i.worldNormal);
fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
fixed3 lambert = saturate(dot(worldNormal, worldLightDir));
fixed3 albedo = lambert * _Diffuse.xyz * _LightColor0.xyz + UNITY_LIGHTMODEL_AMBIENT.xyz;
fixed3 color = tex2D(_MainTex, i.uv).rgb * albedo;
//这里为了比较方便，直接用color和最终的边缘lerp了
float lerpValue = _DissolveThreshold / dissolveValue.r;
if (lerpValue > _ColorFactorA)
{
if (lerpValue > _ColorFactorB)
return _DissolveColorB;
return _DissolveColorA;
}
return fixed4(color, 1);
}
ENDCG

{
Tags{ "RenderType" = "Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
ENDCG
}
}
FallBack "Diffuse"
}
上面的模型，我们配置一个雷电类型的溶解效果，两个颜色值分别给白色和蓝色。然后噪声图给一张过渡更加柔和一些的，如下图：

来一张动图，先逐渐增大溶解阈值，就是溶解效果；然后再减小阈值，就是闪亮登场的效果：

//溶解效果
//by：puppet_master
//2017.5.19

{
Properties{
_Diffuse("Diffuse", Color) = (1,1,1,1)
_DissolveColor("Dissolve Color", Color) = (0,0,0,0)
_DissolveEdgeColor("Dissolve Edge Color", Color) = (1,1,1,1)
_MainTex("Base 2D", 2D) = "white"{}
_DissolveMap("DissolveMap", 2D) = "white"{}
_DissolveThreshold("DissolveThreshold", Range(0,1)) = 0
_ColorFactor("ColorFactor", Range(0,1)) = 0.7
_DissolveEdge("DissolveEdge", Range(0,1)) = 0.8
}

CGINCLUDE
#include "Lighting.cginc"
uniform fixed4 _Diffuse;
uniform fixed4 _DissolveColor;
uniform fixed4 _DissolveEdgeColor;
uniform sampler2D _MainTex;
uniform float4 _MainTex_ST;
uniform sampler2D _DissolveMap;
uniform float _DissolveThreshold;
uniform float _ColorFactor;
uniform float _DissolveEdge;

struct v2f
{
float4 pos : SV_POSITION;
float3 worldNormal : TEXCOORD0;
float2 uv : TEXCOORD1;
};

v2f vert(appdata_base v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);
return o;
}

fixed4 frag(v2f i) : SV_Target
{
//采样Dissolve Map
fixed4 dissolveValue = tex2D(_DissolveMap, i.uv);
if (dissolveValue.r < _DissolveThreshold)
{
}
//Diffuse + Ambient光照计算
fixed3 worldNormal = normalize(i.worldNormal);
fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
fixed3 lambert = saturate(dot(worldNormal, worldLightDir));
fixed3 albedo = lambert * _Diffuse.xyz * _LightColor0.xyz + UNITY_LIGHTMODEL_AMBIENT.xyz;
fixed3 color = tex2D(_MainTex, i.uv).rgb * albedo;

float percentage = _DissolveThreshold / dissolveValue.r;
//如果当前百分比 - 颜色权重 - 边缘颜色
float lerpEdge = sign(percentage - _ColorFactor - _DissolveEdge);
//貌似sign返回的值还得saturate一下，否则是一个很奇怪的值
fixed3 edgeColor = lerp(_DissolveEdgeColor.rgb, _DissolveColor.rgb, saturate(lerpEdge));
//最终输出颜色的lerp值
float lerpOut = sign(percentage - _ColorFactor);
//最终颜色在原颜色和上一步计算的颜色之间差值（其实经过saturate（sign（..））的lerpOut应该只能是0或1）
fixed3 colorOut = lerp(color, edgeColor, saturate(lerpOut));
return fixed4(colorOut, 1);
}
ENDCG

{
Tags{ "RenderType" = "Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
ENDCG
}
}
FallBack "Diffuse"
}
效果与上面基本一致，所以这次我们换个颜色再来一发燃烧溶解效果，把颜色调整成黄色和红色：
再来一发动图：

不仅仅是溶解，还要灰飞烟灭

比如，我们试一下让模型按照法线方向外拓一下，再极小的范围下，可以实现模型的大小的扩张，不过这个扩张并不是多大都可以，如果太大了，就会出现“三角形爆炸”的情况，可以参考一下本篇文章最后的图片。我们只是轻轻的让它扩张一下就可以了。比如下面这句，当大于一定阈值的时候，才开始扩张效果：
v.vertex.xyz += v.normal * saturate(_DissolveThreshold - _FlyThreshold) * _FlyFactor;这次我们换一个雪花点类型的噪声图，效果如下：

关于沿着某个方向消散的效果的一点讨论

感觉沿着法线方向飞出来感觉效果不好控制，尤其是容易看到三角形穿帮的情况。我们也可以让模型在溶解超过一定阈值之后向上飞，大概是这样的一个效果，还是那个帅帅哒模型，不过我们换了个角度：

下面一段纯属废话，感兴趣的可以看一下本人的内心独白：

溶解效果副产品

第一弹，直接在溶解效果后面计算一个叠加的颜色值，根据Noise采样叠加到原始模型上的效果：float lerpValue = (dissolveValue.r - _DissolveThreshold) * _DissolveEdge;
fixed3 final = color + _DissolveColor * lerpValue;
脑补一下使用的场景：从左到右分别是病毒感染了，闪瞎眼了（其实只是过暴，因为加上bloom比较出效果罢了），秽土转生要结束了（火影迷暴露无遗....）

第二弹，爆炸效果...这个是调溶解残片飞出去的时候，权值给的太高，直接三角形炸开了....感觉好惨，其实主要就是沿着模型法线方向偏移：
v.vertex.xyz += v.normal * _DissolveThreshold * 0.5;


展开全文
•  感谢对我的支持，在上一篇文章《 [Unity3D]Unity3D游戏开发之仿仙剑奇侠传角色控制效果》中，我们通过自定义脚本实现了在RPG游戏中的角色控制器，当然这个角色器目前还不完善，为什么这么说呢，我在后面的一篇...
         大家好，我是秦元培，欢迎大家关注我的博客，我的博客地址是blog.csdn.net/qinyuanpei。
感谢对我的支持，在上一篇文章《 [Unity3D]Unity3D游戏开发之仿仙剑奇侠传角色控制效果》中，我们通过自定义脚本实现了在RPG游戏中的角色控制器，当然这个角色器目前还不完善，在碰撞以及控制等方面还存在某些问题和不足，对于这些问题，我会在后面的一篇文章中会给大家做详细的说明，力图设计出一个为RPG游戏服务的角色控制器，方便大家开发RPG类型的游戏。那么，今天我想和大家分享的是在Unity3D中一个比较重要的组件——布娃娃(Ragdoll)。我们首先来看张图片吧！

相信熟悉仙剑的朋友一定知道这样一句话：胜败乃兵家常事，大侠请重新来过。从仙剑一到仙剑五前传，仙剑带给我们的感动里不仅仅是一个个跌宕起伏、感人至深的故事，还有每一次战斗失败之后从头再来的勇敢。人生有时候就像游戏一样，我们总会遇到这样或着那样的挫折和困难。虽然在仙剑这样一个五灵六界的世界观下，人类基本作为最弱小的生命存在，但是每次我们的主角们不是一直在努力去做吗？所以我们的人生一定要积极向上，充满激情地去做一件事情。博主最讨厌的就是玩游戏玩到最后只剩下打嘴仗的这种玩家，游戏一定是有输有赢的，试问各位仙剑玩家哪一个没有被Boss虐过，可是游戏的乐趣不就是在于一遍遍地去超越自己吗？输不可怕，怕的是我们因为输了就丧失了努力的勇气。我觉得仙剑一直再像我们传递一种正能量，那就是我们一定要让自己勇敢，人生中有很多的事情或许我们都无法掌控，就像李逍遥剑术超凡却不能帮助灵儿逃脱宿命、云天河拥有神龙之息、后羿射日神弓，为救山下百姓而箭射琼华，却救不了心爱的女孩儿的性命、夏侯瑾轩以为
凡事尽心尽力就能做好，可是到最后他却只能拿匕首刺向瑕妹子，只是为了不让枯木占据她的身体。或许我们并不知道未来会是什么样子吧，但是至少在此时此刻，我们曾经努力过、我们很用心地做过某些事情，这样就够了。好了，我们不去评论这些玩家了，我们正式开始今天的内容。
在RPG游戏中，当角色HP降低到0时，角色即进入了死亡状态，此时角色将倒在地上。在过去的游戏设计中，角色倒在地上的动作通常是由动画师绘制一定的动画来完成的，这种方式虽然简单，但是由于角色倒地的动作都是相同的，无法实时反映出角色受攻击的情况，所以在游戏开发领域逐渐形成了一种新的模型即布娃娃(Ragdoll)，该模型就是用来模拟角色死亡的状态的。在Unity3D中，系统为我们提供了布娃娃组件，下面请大家和我一起来学习怎样使用布娃娃来模拟角色死亡的状态吧：
首先我们创建一个新项目，在场景中创建一个Plane和平行光，接下来我们导入我们事先准备好的FBX模型，此时在游戏场景中应该可以看到下面的内容：

接下来，我们选中模型Samuzai，为其创建一个布娃娃组件：

我们一起来看打开的对话框：

如果我们的模型中提供了骨骼动画的话，那么我们单击右侧的选择按钮就能找到相应的文件，然后我们点Create，此时模型下的骨骼组件应该会变成下面这个样子：

我们将盒子碰撞器移除，将模型的动画设为None，现在我们来运行程序：

可以看到，我们的角色很真实地倒在了地上，而且如果我们多次运行程序的话，会发现角色每次死亡的时候都是不一样的，这样大大增强了游戏的真实感，如果每次战斗死亡的姿势都是一样的，这样会不会视觉疲劳呢？虽然《轩辕剑6》的市场反响并不怎么样，然而得益于Unity3D中的强大物理引擎，每次怪物死亡的时候都死得比较有范儿，大家可以自己去玩玩试玩版啊，哈哈。这里希望仙剑奇侠传的后续作品能够注意到这个问题，作为大侠，我们要死得轰轰烈烈的嘛，好了，这就是今天的文章了，希望大家喜欢！
喜欢我的博客请记住我的名字：秦元培，我的博客地址是：blog.csdn.net/qinyuanpei
转载请注明出处，本文作者：秦元培，本文出处：http://blog.csdn.net/qinyuanpei/article/details/23869275


展开全文
这段代码是在Unity蛮牛给人解答的时候写的，第一次写Shader，Unity官方的语法还没来得及完全过一遍，比较仓促，还好效果实现了！
笔记：Alpha Blending则是一种中庸的方式，它使用当前fragment的alpha作为混合因子，来混合之前写入到缓存中颜色值。但Alpha Blending麻烦的一点就是它需要关闭ZWrite，并且要十分小心物体的渲染顺序。如果不关闭ZWrite，那么在进行深度检测的时候，它背后的物体本来是可以透过它被我们看到的，但由于深度检测时大于它的深度就被剔除了，从而我们就看不到它后面的物体了。因此，我们需要保证物体的渲染顺序是从后往前，并且关闭该半透明对象的ZWrite。

Shader "Custom/Test" {
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
_Alpha("Alpha", Range (0.01,1.0)) = 0.5
}
Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
LOD 200
Pass {
ZWrite Off
}

CGPROGRAM
#pragma surface surf Lambert alpha

sampler2D _MainTex;
float _Alpha;
fixed4 _Color;

struct Input {
float2 uv_MainTex;
};

void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Emission = c.rgb;
o.Alpha = _Alpha;
}
ENDCG
}
FallBack "Diffuse"}
Shader "Transparent/DiffuseS" {
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
}

Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
LOD 200

CGPROGRAM
#pragma surface surf Lambert alpha

sampler2D _MainTex;
fixed4 _Color;

struct Input {
float2 uv_MainTex;
};

void surf (Input IN, inout SurfaceOutput o) {
fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
o.Emission = c.rgb;
o.Alpha = c.a;
}
ENDCG
}

Fallback "Transparent/VertexLit"}
这个shader可以在移动端使用没有问题，修改的时候只要修改_Color属性和颜色值即可！
展开全文
• 1.第一步，首先新建一个unity3d项目，导入Standard Assets>ImageEffects 插件（灰屏效果有用到噢），格外还导入Demo用到的角色资源［Spider Green插件］；    2.第二步，需要在场景中创建一个摄像机，...

1.第一步，首先新建一个unity3d项目，导入Standard Assets>ImageEffects
插件（灰屏效果有用到噢），格外还导入Demo用到的角色资源［Spider Green插件］；

2.第二步，需要在场景中创建一个摄像机，并且摄像机附加ColorCorrectionCurves.cs 组件；

3.第三步，把Spider Green中的SPIDER.Prefab拖到场景中，并且新加组件GameOver.cs;

GameOver.cs代码如下：

[C#]

?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityStandardAssets.ImageEffects;

public class GameOver : MonoBehaviour {

private  Animation _curAnim;
private ColorCorrectionCurves _colorCor;

// Use this for initialization
void Start () {
if (_curAnim == null)
_curAnim = GetComponent<Animation> ();

if (_colorCor == null)
_colorCor = FindObjectOfType<ColorCorrectionCurves> ();
}

void OnGUI()
{
if (GUI.Button (new Rect (50, 100, 100, 50), "怪物重生")) {
SetAnimationPlay ("Attack",WrapMode.Loop);
SetColorCorrectionCurvesSaturation (1);

}
if (GUI.Button (new Rect (50, 200, 100, 50), "杀死怪物")) {
SetAnimationPlay ("Death",WrapMode.Once);
SetColorCorrectionCurvesSaturation (0);
}
}
/// <summary>
/// 设定当前播放的动画
/// </summary>
/// <param name="animName">Animation name.</param>
/// <param name="wrapL">Wrap l.</param>
void SetAnimationPlay(string animName,WrapMode wrapL)
{
if (_curAnim) {
_curAnim.Play (animName);
_curAnim.wrapMode = wrapL;
}
}
/// <summary>
/// 设定当前摄像机的颜色度
/// </summary>
/// <param name="duration">Duration.</param>
void SetColorCorrectionCurvesSaturation(int duration)
{
if (_colorCor)
_colorCor.saturation = duration;
}
}
m>
void SetColorCorrectio

4.最后，直接运行项目看效果啦！


展开全文
• Unity3D实现的角色攻击、移动待机死亡以及怪物自动寻路AI等（直接Unity运行）
• 导入Image Effects包。 方法一：给摄像机添加“Color Correction Curves”脚本，调整“Saturation”属性的值到0。 方法二：给摄像机添加“GrayscaleEffect”脚本，调整Ramp Offset属性可以修改画面亮度。...
• 在学习unity3d的过程中遇到一个问题,就是在任务死亡的时候人物会一直重复死亡的动作,在设置animations的之后发现一起都没问题,触发器也是使用的trigger,一起都没问题,一直没找到解决的办法,终于在一片博客的帮助下...
• Unity3D角色控制及敌人AI（寻路、攻击、死亡）示例工程包
• 一，新建一个空物体LevelManager用来管理我们的复活，金币等脚本 二，为空物体LevelManager新建一个脚本LevelManager； 三，脚本 　把Player和LevelManager拖到指定的公共变量中 1，PlayerController ...
•  在前面的文章中，我们分别实现了一个自定义的角色控制器《[Unity3D]Unity3D游戏开发之仿仙剑奇侠传角色控制效果》和角色死亡的效果《[Unity3D]Unity3D游戏开发之仿仙剑奇侠传角色死亡效果实现》。今天我们继续来做...
• unity 3D人物有动画 好几种人物 自带animator 攻击死亡站立跑。都有！
• bool AnimationStillPlaying( string animationName ) { return _animation.IsPlaying(animationName) && _animation[animationName].normalizedTime; }   ... 范围0 -- 1, 0是动作开始，1是
• Unity3D 2D角色看向鼠标方向 本篇文章是通过动画控制器 (Animator) 中的混合树 (Blend Tree) 来实现2D角色看向鼠标方向，希望能对您有帮助。 还记得我曾经的毕设，是一款2D解谜游戏，游戏中的小人会根据鼠标位置看...
• ## Unity3D常见面试题

万次阅读 多人点赞 2017-08-11 20:20:00
Unity3D常见面试题
• 关于2D游戏中游戏玩家的出生、无敌、死亡方法可以通过如下一个小实例详细讲解我们小时候都玩过一款游戏——坦克大战所以此实例为如何实现玩家坦克的出生、无敌、以及死亡方法首先我们制作一个出生动画特效（此动画...
• 今天和大家分享的是在Unity3D中一个比较重要的组件——布娃娃(Ragdoll)。我们首先来看张图片吧！ 相信熟悉仙剑的朋友一定知道这样一句话：胜败乃兵家常事，大侠请重新来过。从仙剑一到仙剑五前传，仙剑带给我们的...
• 最近刚开始看unity3d游戏开发，感觉2d游戏似乎简单些，所以先从2d游戏入手试试看吧。 2d游戏大约要分为背景，角色（需要控制的己方角色car，敌机enemy，奖励物品prop），ui（分数显示，暂停继续等），音乐（背景...
• 在RPG游戏中，当角色HP降低到0时，角色即进入了死亡状态，此时角色将倒在地上。在过去的游戏设计中，角色倒...在Unity3D中，系统为我们提供了布娃娃组件，下面请大家和我一起来学习怎样使用布娃娃来模拟角色死亡的状态