假期笔记1-6节
b站麦扣老师的课程:教程链接
学习笔记
第一节
1.创建管线
将项目升级到URP通用渲染管线,在包管理器中搜索Universal RP,安装后为项目创建渲染管线,如图

在创建的管线中,在属性General的Renderer List中可以添加渲染器。
在edit——project settings——Graphics中设置刚才添加的渲染管线,同时在quality中也可以进行添加。
2.添加素材
在寻找素材时,需要注意该素材是否支持当前的渲染管线,在素材的描述中可以查看是否支持
3.为渲染管线适配素材和场景
当将素材放到场景中不能正常显示时,一般是没有适配当前的渲染管线。
这个场景素材中已有,可直接安装升级。

对于人物素材,在edit菜单中

第一个选项是将整个project中的材质都升级到URP,第二个是仅将选中的材质升级到URP。一般是直接全部升
级,升级后场景中的素材可以正常显示。
第二节
天空盒
在这个下拉菜单处可以隐藏场景中默认的天空盒

同时,可以在资源商店中寻找合适的天空盒资源导入工程
导入后,还可以调整天空盒的参数来实现不同的效果。
在windows——rendering——中调出lighting窗口,在lighting的Environment可以
调整默认的天空盒
场景搭建
要先场景中添加物体时,可以直接拖拽到Hierarchy窗口中,这样物体就会保持初
始的默认位置。
调整角色的影子,在之前建立的渲染管线中进行调整:
Shadows属性
Max Distance:默认的距离50,也就是在50米远的范围内,都进行阴影
的渲染,这个距离是指摄像机可以看到的距离。当场景中的物体较多时,可以减小
该距离,以降低性能的消耗。
Cascade Count: 是指分为几层几级来渲染,当模拟真实场景时,远处的东西会比较
虚,近处的比较实。如分为两层,可以设置每一层的距离,第一层的为实阴影,第
二层为虚的阴影。
Normal Bias:这个值越低,阴影越实,中间没有缝隙
Soft Shadows:虚阴影
Lighting属性中的Shadow Resolution,这个值越高,阴影效果越好,同时开销也
越高。
Quality属性
Anti Aliasing(MSAA) :抗锯齿级数
需要开启Quality中的HDR,在后期的后处理效果中需要用到。
场景光照设置
调出lighting窗口,新建一个光照设置文件New...


Shadowmask:间接烘焙
Progressive GPU:使用gpu来渲染可以节省CPU的开销,调整好参数后,进行渲染。
在lighting的环境设置中,环境光的来源默认是天空盒,场景的渲染会受到环境光
的影响,也可以进行修改,Color时还可以调整需要的颜色和光照强度。
场景中物体的放置
按住V键,再去拖拽物体,物体的坐标中间会有一个矩形,碰到其他平面时,会自
动吸附,这样就可以很方便的放置物体。
Crtl+shift+F,便捷调整游戏视图。
第三节
导入包Poly brush(一个用来编辑地形和场景的工具),安装后菜单栏中会出现Tools栏,
在里面即可使用Poly brush。
Poly brush
第一个是用来调节地形高度的工具
先选中地面,点击该按钮,正常是向上,按住ctrl后是向下。mirroring是镜像工
具,可以选择在某个方向上同时刷两个对称的。direction:方向,可以选择法线方
向等。
第二个是柔化工具,用来将比较坚硬的顶角刷平。
第三个是将当前的物体刷上不同的颜色
但是需要选中的物体的材质是poly brush的材质,在poly brush的shader graph中直
接右键创建材质赋给对应物体即可。如果希望某块场景整个变成某个颜色,直接点
击Flood。这个功能可以用来规划不同的区域。
第四个是将预制件刷到场景中
需要先将一些预制件放到Current Palette,需要刷哪些,放到Brush loadout中。按
住ctrl键再点击是消除已经刷上的物体。在这个笔刷工具下,有一个选项Hit
Surface is Parent,可以将这个地形上的所有物体自动的整理到这个地形的子集中
第五个是纹理刷工具。
ProBulider
下载导入该插件,用来创建基本的地形,在Tools栏里可以看到(一般下载的插件
都在这里)
点击三个点,选择如图,较为直观,按住sfift,可查看具体的功能

对于有齿轮的选项,按住Alt再点击齿轮可进行进一步的设置(调出了shape Tool窗
口)
使用plane来作为基本的地形,后面两个参数是使用Probulider的主要原因,可以设
置顶点数目,数值越大,场景的细节越丰富,设置好后点击build

ProGrids
需要先在项目设置的包管理器中将Enable Preview Packages勾选,然后在包管理器
中才可以搜索到这个包。安装后在Tools栏打开该工具
ProGrids主要的做法是让场景中多一些参考线

最下面的三个就是场景当中的参考线,选择3D时,会显示立体网格,格子的密度由
第一个数值决定,角色在移动时,会按照格子移动一个格子的距离。
地形一开始设置的是正方形切割,选中地形,在Probulider窗口中使用

将地形变成为三角形切割,适合Lowpoly风格。
第四节
打开导航窗口,windows---AI---Navigation。
导航,烘焙地图
将需要进行烘焙的物体设置为Navigation static类型,这样才可以被烘焙,并且在设置时不要将地面上的子物体也
设置为Navigation static类型,而是只将地面设置为Navigation static类型。
Navigation窗口下的子窗口
1:Agents,被导航的对象
2:Areas,导航区域设置
3:Object,可以对选中的物体进行导航相关的设置,可以设置是否可行走
4:Bake,烘焙子窗口,点击Bake,场景中可通过的部分会被用蓝色标识出来。Agent Radius,调整角色的半径。Max Slope :可通过的最大坡度。Step Height :可通过的楼梯高度
为避免人物和树木的穿模,可以将树木所在的区域设置为不可通行,在层级窗口中直接搜索tree,选中所有的
tree,将其设置为Navigation static类型,然后选择不可通行即可。
为需要控制的角色添加Nav Mesh Agent组件,添加后,选中添加后的角色, 调整其Agent的大小,使其符合人物
的大小。同时还要在NAvigation的Bake窗口中调整为同样的值。
场景的障碍物(一般是可移动的物体)可以添加Nav Mesh Obstacle组件,可以选择其形状(box,Capsule),
该组件的Carve选项表示切割,就是可移动的物体在移动后,切割的区域仍然存在。
第五节
代码控制人物移动
实现的思路是通过事件,让某个物体通过某个函数来实现,
1,编写脚本,先来实现事件
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;//使用事件的引用
[System.Serializable]
//序列化,因为EventVector3不是继承自MonoBehaviour的,所以需要这个描述,才可以在Unity中显示出来相应的事件
public class EventVector3 : UnityEvent<Vector3> { }
//EventVector3继承自UnityEvent,尖括号内写引用类型(Vector3)
public class MouseManager : MonoBehaviour
{
public EventVector3 OnMouseClicked;
}
2,

NavMeshAgent.destination,这个方向就是让角色移动到目标点
3,获取鼠标点击的目标点,方向是从摄像机的位置发射一条射线来看其碰撞到了世界坐标的哪个位置,查找手
册,使用Camera.ScreenPointToRay()方法,还要使用Physics.Raycast()来计算射线碰撞的物体的相关信息。使用
RaycastHit来保存射线碰撞到的物体的信息。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;//使用事件的引用
[System.Serializable]
//序列化,因为EventVector3不是继承自MonoBehaviour的,所以需要这个描述,才可以在Unity中显示出来相应的事件
public class EventVector3 : UnityEvent<Vector3> { }
//EventVector3继承自UnityEvent,尖括号内写引用类型(Vector3)
public class MouseManager : MonoBehaviour
{
RaycastHit hitinfo;//用来保存射线碰撞到的物体的相关信息
public EventVector3 OnMouseClicked;
void Update()
{
SetCursorTexture();
MouseControl();
}
void SetCursorTexture()//设置指针的贴图
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(ray,out hitinfo))
{
//切换鼠标贴图
}
}
void MouseControl()
{
if(Input.GetMouseButtonDown(0) && hitinfo.collider != null)
//鼠标左键点击,但是有可能会点到地图外面,所以要加上后面的判断,点击物体的碰撞体不为空
{
if (hitinfo.collider.gameObject.CompareTag("Ground"))
OnMouseClicked?.Invoke(hitinfo.point);
//当前事件不为空的时候使用Invoke执行,OnMouseClicked,并且该事件的引用类型为Vector3,Raycast的point为碰撞点
}
}
}
注意不要忘记将地面的Tag改为Ground。
在角色的Nav Mesh Agent 属性中,可以修改角色移动的速度以及角速度等,Stopping Distance是角色会移动到
距离指定位置的这个数值。这个功能适合在攻击敌人的时候,由于武器有不同的长度,由此可以来控制。
Auto Braking:如果希望角色有一个缓慢停止的过程,则勾选。
第六节
上一节的人物控制的方法太过麻烦,使用单例模式会更加简单
改进控制方法
新建人物控制脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;//导航相关的内容需要使用该命名空间
public class PlayerController : MonoBehaviour
{
private NavMeshAgent agent;
void Awake()//自身变量的获取一般放在Awake中
{
agent = GetComponent<NavMeshAgent>();
}
void Start()
{
MouseManager.Instance.OnMouseClicked += MoveToTarget;
//将MoveToTarget注册。想要注册一个方法,必须保持参数的一致,如在本例中,都只有一个Vector3类型的变量
}
public void MoveToTarget(Vector3 target)
{
agent.destination = target;
}
//总结:事件在mousemanager中触发,当点击地面时,它就会执行所有加入到OnMouseClicked的函数方法;
}
还要修改mousemanager脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;//unity自带的事件
public class MouseManager : MonoBehaviour
{
public static MouseManager Instance;
RaycastHit hitinfo;//用来保存射线碰撞到的物体的相关信息
public event Action<Vector3> OnMouseClicked;//创建了一个事件
//事件就是需要被人注册使用,
void Awake()//单例模式
{
if (Instance != null)
Destroy(gameObject);
Instance = this;
}
void Update()
{
SetCursorTexture();
MouseControl();
}
void SetCursorTexture()//设置指针的贴图
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hitinfo))
{
//切换鼠标贴图
}
}
void MouseControl()
{
if (Input.GetMouseButtonDown(0) && hitinfo.collider != null)
//鼠标左键点击,但是有可能会点到地图外面,所以要加上后面的判断,点击物体的碰撞体不为空
{
if (hitinfo.collider.gameObject.CompareTag("Ground"))
OnMouseClicked?.Invoke(hitinfo.point);
//当前事件不为空的时候使用Invoke执行,OnMouseClicked,并且该事件的引用类型为Vector3,Raycast的point为碰撞点
}
}
}
这样就不需要每次拖拽人物到事件,然后选择方法了。
鼠标贴图修改
下面来修改鼠标的贴图,先导入图片资源,需要将其类型修改为cursor类型,然后才可用为鼠标贴图。
代码中添加两部分内容
public Texture2D point, doorway, attack, target, arrow;
//定义后在unity中将相应的图片资源拖拽到开放出来的变量里
//以及上节没有写的函数(if语句里的内容),切换鼠标贴图,这里只写了一个例子
switch(hitinfo.collider.gameObject.tag)
{
case "Ground":
Cursor.SetCursor(target, new Vector2(16, 16), CursorMode.Auto);
//16,16是根据图片尺寸来决定的,这里的图片大小为32
break;
}