闲着没事就更新一下
经过我们两年的不断修改,游戏终于快上线了。现在的环境和以前大不一样了。换做三年前,游戏估计能提前半年。(过审是真的很难)。好像有点扯远了。今天和大家分享什么功能呢?
unity游戏后期制作
什么是游戏后期制作?一开始我也不知道,只是策划说。我们需要做一个类型相机聚焦的效果。要突出主角,其他的游戏资源淡化掉。从来没有接触过这些,只能问度娘了。问了才知道原来策划的这个需求叫做:游戏后期制作。废话有点多了。我们还是进入正题吧。
相机的一些基本属性
这里需要你了解相机的三个属性 1:ClearFlags , 2:CullingMask,3:Depth
ClearFlags 属性
Clear Flags 包含一下4种方式
- Skybox:天空盒(默认项)。在屏幕空白处显示当前摄像机的天空盒,如果没有指定天空盒,则会显示默认背景色。
- Solid Color:空白处将显示默认此处设置的背景色。
- Depth only:仅深度,该模式用于对象不被裁剪。
- Don’t Clear:不清除,该模式不清楚任何颜色和或深度缓存,但这样做每帧渲染的结果都会叠加在下一帧之上。 具体的细节大家自行查阅资料。
CullingMask属性
和我们的游戏的层对应(Layer),他决定了我们摄像机能渲染的游戏资源。
Depth属性
字面意思:深度。在游戏场景中出现多个摄像机才有发挥的空间。
制作流程
- 我们需要给游戏添加两个特性的层,我这里是CastSkill,和GameObject_Layer层
在需要展示时候,把要显示的资源设置成CastSkill层,其他的设置成GameObject_Layer层。 - 我们需要在场景中创建两个相机,并对相机进行参数设置,这里的参数主要是上文提到的三个参数
第一个相机参数为: ClearFlags -->> Skybox, CullingMask -->> 全部都选上, Depth -->> 10
第二个相机参数为: ClearFlags -->> DepthOnly, CullingMask -->> CastSkill(只选一项), Depth -->> 11, 父节点是第一个相机,其他的参数要一致。 - 给主相机创建一个模糊的CameraShader脚本和Shader脚本,我这里的需求是半透明黑化。代码如下
CameraShader脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraShader : MonoBehaviour {
private Material mat;
private Shader shader;
[Range(0, 2.0f)]
public float colorStrenght = 1f;
Material material
{
get
{
if (mat == null)
{
mat = new Material(shader);
mat.hideFlags = HideFlags.HideAndDontSave;
}
return mat;
}
}
// Use this for initialization
void Start()
{
//获取shader
shader = Shader.Find("PurpleWhale/CastMagicEffect");
//判断显卡是否支持图像后期处理效果
if (!SystemInfo.supportsImageEffects)
{
enabled = false; //此为代码的enable
return;
}
}
private void OnRenderImage(RenderTexture source, RenderTexture destination)
{
if (shader != null)
{
material.SetFloat("_ColorStrenght", colorStrenght);
Graphics.Blit(source, destination, material);
}
else
{
Graphics.Blit(source, destination);
}
}
// Update is called once per frame
void Update()
{
#if UNITY_EDITOR
if (Application.isPlaying != true)
{
shader = Shader.Find("PurpleWhale/CastMagicEffect");
}
#endif
}
void OnDisable()
{
if (mat)
{
DestroyImmediate(mat);
}
}
}
Shader脚本
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "PurpleWhale/CastMagicEffect" {
Properties {
_MainTex ("MainTex", 2D) = "white" {}
_ColorStrenght("_ColorStrenght",Range(0,2)) = 0.1
}
SubShader {
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
//fixed _test_value;
struct VertexInput {
fixed4 vertex : POSITION;
fixed2 uv : TEXCOORD0;
};
struct VertexOutput {
fixed4 pos : SV_POSITION;
fixed2 uv : TEXCOORD0;
};
VertexOutput vert (VertexInput v) {
VertexOutput o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
sampler2D _MainTex;
fixed _ColorStrenght;
fixed4 frag(VertexOutput i) : SV_TARGET {
return tex2D(_MainTex, i.uv) * _ColorStrenght;
}
ENDCG
}
}
FallBack "Diffuse"
}
- 最后一步,在游戏执行过程中,需要执行的时候,代码手动创建,父级相机挂上CameraShader脚本,设置各自的相机参数。
我这里是用Lua创建的,你们可以根据自己的需求来
-- 创建技能相机/技能渲染相机
function LuaFightCamera.CreateSkillCamera(postion, rotation, DestroyTime, fieldOfView, bool_renderCamera, renderCameraDestroyTime)
-- 技能
local skillCamera = GameObject.New()
skillCamera.name = "skillCamera"
local _type = Tools.GetUnityType("Camera")
skillCamera = skillCamera:AddComponent(_type)
skillCamera.transform.position = postion
skillCamera.transform.localRotation = Quaternion.Euler(rotation)
skillCamera.depth = 10 -- 战斗相机 -1 ,技能 0 - 99 ,UI 相机 100
skillCamera.fieldOfView = fieldOfView
LuaFightCamera.m_SkillCamera = skillCamera
Tools.SetCameraCullingMask(skillCamera.gameObject, UnityLayers.UI_2D, 5)
if true == bool_renderCamera then
local cameraShader = Tools.GetScriptsType("CameraShader")
if cameraShader then
LuaFightCamera.m_CameraShader = skillCamera.gameObject:AddComponent(cameraShader)
LuaFightCamera.m_CameraShader.colorStrenght = 1
local lerp_change_colorStrenght = function(ChangeColorStrenght)
LuaFightCamera.m_CameraShader.colorStrenght = ChangeColorStrenght
BattleObjectManager.SetBattleObjLayer(SkillManager.CameraShow.SkillCamera.MainRole, UnityLayers.CastSkill)
end
DotweenHelper.TweenerOnComplete(DotweenHelper.To(lerp_change_colorStrenght, 1, 0.2, 1), function(ChangeColorStrenght) end)
CoroutineHelper.WaitForSeconds(
renderCameraDestroyTime,
function()
local lerp_change_colorStrenght = function(ChangeColorStrenght)
LuaFightCamera.m_CameraShader.colorStrenght = ChangeColorStrenght
BattleObjectManager.SetBattleObjLayer(SkillManager.CameraShow.SkillCamera.MainRole, UnityLayers.CastSkill)
end
DotweenHelper.TweenerOnComplete(DotweenHelper.To(lerp_change_colorStrenght, 0.2, 1, 1), function(ChangeColorStrenght) end)
end
)
end
-- 渲染相机
BattleObjectManager.SetBattleObjLayer(SkillManager.CameraShow.SkillCamera.MainRole, UnityLayers.CastSkill)
local renderCamera = GameObject.New()
renderCamera.name = "renderCamera"
renderCamera = renderCamera:AddComponent(_type)
renderCamera.transform.position = postion
renderCamera.transform.localRotation = Quaternion.Euler(rotation)
renderCamera.depth = skillCamera.depth + 1 -- 战斗相机 -1 ,技能 0 - 99 ,UI 相机 100
renderCamera.fieldOfView = fieldOfView
Tools.SetCameraCullingMask(renderCamera.gameObject, UnityLayers.CastSkill, 1)
renderCamera.transform.parent = skillCamera.transform
renderCamera.clearFlags = CameraClearFlags.Depth
CoroutineHelper.WaitForSeconds(
renderCameraDestroyTime,
function()
BattleObjectManager.SetBattleObjLayer(SkillManager.CameraShow.SkillCamera.MainRole, UnityLayers.GameObject_Layer)
end
)
end
CoroutineHelper.WaitForSeconds(
DestroyTime,
function()
isCameraMove = false
LuaFightCamera.m_SkillCamera = nil
BattleObjectManager.SetBattleObjLayer(SkillManager.CameraShow.SkillCamera.MainRole, UnityLayers.GameObject_Layer)
UnityEngine.Object.Destroy(skillCamera.gameObject)
end
)
return skillCamera
end
看看效果
释放技能的时候,只突出自己,其余的都半透明黑化,技能释放完毕,回复正常。