目录
环境搭建
安装URP
先安装URP
↑安装URP的unity package
新建一个渲染管线:
在edit里设置渲染管线:
升级URP,就可以将人物原本丢失的材质补回来。
添加天空盒
然后在rendering-lighting-environment里可以更换天空盒
然后可以在此设置天空盒:
设定阴影渲染
这个设置可以设置最大渲染的阴影的距离,超过这个距离则不再渲染,这个可以节省资源
这里可以调整阴影的各种参数:
这个地方可以修改虚实阴影分成几级,比如这里,超过1级12.5m渲染出来的阴影就会比较虚了。
注意要开启HDR,方便后期进行后处理
这里还可以添加抗锯齿
修改光照渲染
在window-lighting添加光照文件:
修改模式为烘培,图形为GPU
然后点击右下角的生成光照:
然后点击生成光照:
一般不勾选自动生成
注意到此时光变成了蓝紫色,这是因为光照默认是用skybox的颜色的,可以在environment这里进行修改:
环境搭建
按住v可以更好的设置景物: ctrl+shift也可以进行吸附
调整相机角度可以通过在scene场景中先找好角度,在选中相机的情况下 然后按下ctrl+shift+f来让相机对准:
可以创建一个空物体作为分界线,以下的物体全是人物:
安装polybrush,在sample里导入含urp的shader
在tools里打开:
这里调整高度时,可以通过绕xyz轴还是物体表面
这个可以实现多重对称笔刷
柔化可以让起伏更加平滑
第三个刷色,直接刷色无法上色是因为地面并不是polybrush的material
想要上色可以在polybrush自带的material里的shader右键添加材质:
然后将该材质托给地面,则此时可以上色了
这就可以用来初期规划不同的地方用来做什么
希望整个场景变成某一颜色就选中flood
第四个
将预制体放上去后即可实现点击即出prefabs:
按住ctrl去点按即可删除
扩大地图
接下来我们扩大地图,但是单纯的扩大size,物体的顶点数并不会增多,这里可以使用插件:probuilder:
在tools里打开,
可以按住shift时可以查看其详细信息
按住alt选中上面那个
可以在这里修改其形状
以此添加plane
不过要注意这个物体的中心在角落:
点击这个可以使它回到中心
progrid的使用:
先启用
还可以实现展示x或y或z平面的网格。
这里的2代表的是一个格子0.2,移动物体也是按照一次移动0.2实现的。
在tools里可以关闭
点击这个按钮可以使得网格平面由四格变为三格,可以通过创建材质使得其有颜色:
实现导航
烘焙地面:
对地面选择navigation static
对树的区域同样选中,但是烘焙的时候要选择not walkable:
烘焙成功后 但是不可行走的区域不够精细
为了改变这点
对玩家添加agent
为了使得不可 行走的区域变得精细,需要调整人物的胖瘦高矮
并且在导航这一块也要修改:
上面是静态的障碍物,无法移动的,如果想实现动态的障碍物可以给物体添加障碍物的组件,并且把carve勾选上,就可以实现这块区域在烘焙的时候会被切开来
鼠标控制人物移动
创建一个鼠标点击事件,将人物拖拽进来,并且选择destionation
随后用ScrennPointToRay,获取鼠标所点击的位置
然后给地面设置tag,给MouseManager添加这段代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using UnityEngine.Events;
[System.Serializable]
public class EventVector3 : UnityEvent<Vector3> { }//声明一个事件
public class MouseManager : MonoBehaviour
{
public EventVector3 OnMouseClicked;
RaycastHit hitInfo;
private void Update()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//获取射线
Physics.Raycast(ray, out hitInfo);//将射线信息输出给hitInfo
MouseControl();
}
void SetCursorTexture()
{
}
void MouseControl()
{
if (Input.GetMouseButtonDown(0) && hitInfo.collider != null)
{
if (hitInfo.collider.CompareTag("Ground"))
{
OnMouseClicked?.Invoke(hitInfo.point);//点击之后将该位置传给OnMouseClicked设置的位置
}
}
}
}
即可实现人物走向鼠标点击的地方。
这里可以调整速度和方向:
auto braking实现刹车效果。
以上可以实现鼠标点击人物移动的方式,但是需要将人物拖拽进来
如果以后切换场景或者新建游戏或者多个场景,则不方便拖拽和保存,接下来介绍另外一种方式,将人物移动的这个函数注册到event当中, 无论切换场景还是新建角色,都可以将人物添加到OnMouseClicked的这个event当中。
为了改变上面所说的,此处将将MouseManager设定为单例模式
用event的方式替代上个注释中的方法,
event事件的使用方式就是需要有别人注册它。
当调用这个方法时,所有注册了这个事件的函数都会被调用!
接下来在PlayerController中写一个MoveToTarget函数:
我们需要实现将这个函数的方法注册到mouseManager刚才的那个事件中,只要那个事件一启用,它就会调用这个函数。
(带有闪电的就说明是事件)
总结一下就是,当我们点击到地面时,它会执行所有注册到该事件上的函数,并通过Invoke传入该函数所需的参数:
OnMouseClicked?.Invoke(hitInfo.point);
//点击之后将该位置传给OnMouseClicked这个事件注册的函数并进行调用
于是接下来就可以实现鼠标点击则人物移动的方式了。
鼠标指针切换
将图片导入进来并更改为Cursor
选择Point,然后再Apply一下
第二个参数用来记录偏移值,是因为要使图片的中心才具有点击效果。
注意到鼠标尺寸过大,可以在这里进行调整:
随后即可调整实现鼠标变成指针的效果。
相机跟随
此处先补充一下三个功能:
Move to view
把你选中的游戏对象移动到Scene的中心点:
Align With View
这个用法不移动scene,是将被选中的物体移动到和scene的中心点一致
就要把普通游戏对象和Camera 分开来说了
选中普通的游戏对象:将对象的中心点移动到Scene的中心点一致
选中Camera:让Game视角和Scene视角一致
Align With View to Selected
这个是移动Scene的,把Scene移动到和选中物体的中心点一致
选中普通的游戏对象:将Scene的中心点移动到和对象的中心点一致
选中Camera:让Scene视角和Game视角一致
创建cinemachine并调整:
后处理
给远处添加雾,添加完雾后效果如下所示:
注意要在这里启用:
在Main Camera的rending里也要启用post-processing
开启bloom后效果:
然后添加ToneMapping,:模式ACES
畸变的效果:
此处只需要移动
景深
FocalLength 远处虚化距离,Apeture虚化程度
动画控制器
在这里导入人物的动画控制器,使用融合树对站立行走跑步融合,然后脚本中设置参数即可。
遮挡剔除
创建一个shader和其对应的material
接下来实现人物在树或者其他遮挡物之后会有一个大概轮廓的效果。
添加一个菲尼尔效果:
这里需要一个颜色,所以创建color:
打开着色器并创建color
接下来希望这个颜色和菲尼尔有一个乘法的效果,这样可以把颜色加到菲尼尔现象当中,
再把color放上来
将其连起来
希望这个菲尼尔效果可以有一些噪点让效果看上去更实际,所以添加一些额外常用的节点。
添加dither,调整参数使其出现密密麻麻的小点,可以用来填充球心
添加一个alpha用于遮挡阈值
最终设定如下所示:
接下来回到游戏 ,实现一个人物走到树木后面就应用这个材质,这就涉及到URP
这个是一个render feature,意思是在渲染的时候会有一些feature可以使用。
接下来给玩家添加player的图层,并且在urp中选择:
这样子就可以实现人物在树后面时也有这种效果:
效果如下:
但是人物在镜头前面的时候会有问题,这时候我们在前景也添加一个render
添加后恢复正常。
此处还有个问题就是无法点击树后面,此处可以将tree选成ignore Raycast即可。