(一)Animator动画控制
将角色对象创建为Prefab,创建时选择原始预制体来和原本到导入包的预制体相区分。
unity中可以使用Animator Controller来控制动画的播放,在角色的游戏对象中添加Animator组件。在Projects中创建一个Animator Controller文件,并将其放入角色对象的Animator组件的Controller项。
Animator Controller以状态机的形式来控制动画,希望在游戏中实现动画混合(如移动动画)时常使用blend tree。通过修改parameters来让动画根据参数进行调整,在inspector中可以添加动画列表。
在上次课的PlayerController.cs的基础上来注入参数speed到动画控制器,在脚本中创建一个新的函数来实时设置Speed值,然后将函数添加到Update方法中运行即可。
public class PlayerController : MonoBehaviour
{
private NavMeshAgent agent;
private Animator anim;//Animator controller
private void Awake()
{
agent = GetComponent<NavMeshAgent>();//获得NavMeshAgent方法
anim = GetComponent<Animator>();
}
private void Update()
{
SwitchAnimation();
}
private void Start()
{
MouseManager.Instance.OnMouseClicked+=MoveToTarget;//将方法注册到事件中,每当事件启用就会执行该方法
}
private void SwitchAnimation()//获得人物Speed并写入animator controller
{
anim.SetFloat("Speed", agent.velocity.sqrMagnitude);//sqrMagnitude可将Vector3转换为浮点数值
}
public void MoveToTarget(Vector3 target)//参数要与注册事件的参数一致
{
agent.destination = target;
}
}
(二)Shader Graph 遮挡剔除
当人物移动到树后时会出现两个问题:人物被遮挡以及鼠标无法点击到树下的地面,可通过Shader Graph进行遮挡剔除。
Shader是计算机图形渲染管线的一部分,它是一小段应用程序,告诉计算机在场景中怎样对物体渲染和着色。ShaderGraph则是可视化编辑shader的工具。
在Materials文件夹下新建一个Shader Graph文件夹,创建URP的unlit shader graph(无光照)并在此文件上创建一个新的Material。接下来编辑这个新的shadergraph。(界面的控制很像连接电线)
在ShaderGraph中添加一个Fresnel节点,Fresnel效果会在物体边缘显示一个光圈,可以利用这点做出物体轮廓效果。添加一个变量Color并设置颜色,然后令Color与Fresnel Effect发生乘法现象,从而把颜色加入其中。将Multiply的输出连接到Fragment的base color中即可看到主预览效果。
额外设置的变量可以在外部继续更改,接下来可以添加一些其他效果。Dither可产生噪声处理,看上去像网格的效果。
下面将做出设置,让人物移动到遮挡物后就应用刚设置好的材质。在URP的设置文件-UniversalRenderPipelineAsset_Renderer中
添加两个Feature在其中进行材质设置:其中Player需要单独设置一个图层,从而让系统能够单独对Player设置,两个Feature分别为Player在遮挡物前和后的情况(分两种情况来确保只有被遮挡时才更改材质)
(三)解决移动无法点击到障碍物后方的问题
可以调整所有遮挡物的layer为忽略Raycast,这样就不会与射线发生碰撞。
也可以将所有遮挡物的Mesh collider关闭,因为在MouseManager脚本中是判断射线碰撞来实现移动的。
此外,我的项目中通过Polybrush创造的树木,都由三个对象构成:
后两者是前一个的子对象,而collider只存在于LOD0子对象中。