Unity3D RPG实现 1

 

目录

环境搭建

安装URP

添加天空盒 

设定阴影渲染

修改光照渲染

环境搭建

扩大地图

实现导航

鼠标控制人物移动 

鼠标指针切换

相机跟随

后处理

动画控制器

遮挡剔除


环境搭建

安装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即可。

猜你喜欢

转载自blog.csdn.net/weixin_43757333/article/details/122899840