抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

开个新坑,最近瓶颈期,我觉得需要多敲代码,让自己更熟悉unity.

教程原链接:

https://www.udemy.com/course/project-little-adventurer-learn-to-create-a-3d-action-game/

b站视频链接:

【UNITY教程 | 学习使用高质量的游戏资产创建 3D 动作游戏(更新完毕)】https://www.bilibili.com/video/BV1B14y1E7SW?p=6&vd_source=b702db14148b48ad87406aaf674e1744

  • 付费教程且看且珍惜,是生肉,但是勉强硬啃.(编辑,发现b站有自动生成英文和翻译功能,机翻可以啃的更舒服了)
  • 下面内容是我边查资料,边尝试理解作者的操作意图所作,如有不对欢迎指出.

导入资源包

首先,项目设置里,设置渲染为线性渲染.以下内容为转载

线性渲染

Linear Rendering 和 Gamma Rendering的区别

Linear Rendering就是在shader中所有计算会在线性空间下进行,Gamma Rendering就是在shader中不进行转换到线性空间下,直接计算。然就是计算方程式不同,也就意味例如光照表面会有不同的响应曲线和图片效果,表现不相同。

1.Light Falloff

光照表现一般受光源的距离和法线两个因素影响(在同等光强下)。首先当我们用Linear Rendering时,执行Gamma矫正将会使光照范围变大。第二种会使边缘模糊,分不清界限。这更准确的表现了表面光照强度下降。

img

2.表面响应强度

随着光强的增加,非线性方式计算的表面会更亮一些。这导致了光照在表面很多地方曝光过度,而且给场景模型一个褪色(变白色了)的感觉。当你用线性渲染时,表面颜色仍然随着光照强度线性增加的,这样就使表面材质和颜色更接近现实.

img

3.混合

混合是在帧缓冲区发生的,当使用Gamma Rendering,这表示颜色之间混合是在非线性空间下计算的。然而这是不正确的。

img

上图是在Linear Space中混合结果,颜色之间过度不是很明显。

img

上图是Gamma Space中混合结果,颜色交界处出现了明显的其它颜色,颜色更亮,出现褪色的现象。

4.Mipmaps

计算纹理Mipmap是种线性计算,需要对某个方形区域内像素取平均值,如果纹理存储在非线性空间,那么计算时也是在非线性空间里计算,这样就会得到错误的结果。正确的做法是先转换到线性空间在计算mipmap。

5.Lightmapping

切换linear 和gamma方式,需要重新烘焙相关的Lightmapping。

关于渲染我了解的很少,具体资料可以参考:

————————————————
版权声明:本文为CSDN博主「追风者t」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/k46023/article/details/52489363/


回到项目,设置渲染为线性渲染:

image-20221212180600417

image-20221212181110296

导入包

刚导入时是一片粉色

image-20221214153814297

Package Manager中选择注册表

image-20221214153957120

安装Universal RP

image-20221214154046812

安装完成后打开项目设置,

image-20221214160257935

再安装一个这个

image-20221214161906033

这个

image-20221214162152389

添加包

com.unity.progrids

image-20221214163904210

设置游戏场景

创建一个新空白场景,找到场景预制体拖入场景,并且重置位置属性

image-20221214164716099

新建相机

设置tag为MainCamera

位置可以参考视频里的位置

image-20221214171137639

后处理要打开,虽然我打开之后画面非常模糊,接着往下做看看吧.

image-20221214171548570

新建和配置角色

新建空物体,位置重置为0,0,0

image-20221214171704852

拖入对象

image-20221214172657153

移除动画器

image-20221214172847757

添加灯光

image-20221214185813809

需要设置角色Mesh的layer层级为player

image-20221214185841910

设置完就可以看到灯光

image-20221214185902512

设置虚拟摄像机

image-20221214190728271

注意图里圈出来的地方改一下

image-20221214191340918

添加角色控制器组件

注意数值变化

image-20221214191654870

玩家行走

功能实现写在代码注释中

新建俩脚本添加到player上

image-20221214192130468

玩家输入类PlayerInput.cs

public class PlayerInput : MonoBehaviour
{
[SerializeField] float HorizontalInput;
[SerializeField] float VerticalInput;
private void Update()
{
HorizontalInput = Input.GetAxisRaw("Horizontal");
VerticalInput = Input.GetAxisRaw("Vertical");
}
private void OnEnable()
{
HorizontalInput = 0;
VerticalInput = 0;
}
}

角色控制类character

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Character : MonoBehaviour
{
/// <summary>
/// 胶囊碰撞器
/// </summary>
private CharacterController cc;
[SerializeField] float turnSpeed = 0.5f;//转向速度
[SerializeField] float moveSpeed = 5f;//移速
private Vector3 movementVelocity;//运动速度
private PlayerInput playerInput;//玩家输入
private float verticalVelocity;//垂直速度
public float G = -9.8f;//重力

private void Awake()
{
cc = GetComponent<CharacterController>();
playerInput = GetComponent<PlayerInput>();
}
/// <summary>
/// 计算玩家运动
/// </summary>
private void CalculatePlayerMovement()
{
movementVelocity.Set(playerInput.HorizontalInput, 0f, playerInput.VerticalInput);
movementVelocity.Normalize();
movementVelocity = Quaternion.Euler(0, -45f, 0) * movementVelocity;//对准相机
movementVelocity *= moveSpeed * Time.deltaTime;

//不为0时
if (movementVelocity != Vector3.zero)
{
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(movementVelocity), Time.deltaTime * turnSpeed);//平滑转向运动方
//transform.rotation = Quaternion.LookRotation(movementVelocity);
}

}
private void FixedUpdate()
{
CalculatePlayerMovement();
//判断是否接地
if (cc.isGrounded == false)
{
verticalVelocity = G;//下落速度为重力加速度
}
else
{
verticalVelocity = G * 0.3f;//落地后继续施加三成重力
}
movementVelocity += verticalVelocity * Vector3.up * Time.deltaTime;
cc.Move(movementVelocity);//控制器位移
}
}

动画控制器

创建动画控制器

新建AnimatorController,双击打开.

image-20221216154024185

添加idle状态

新建状态,命名为idle,附加上idle资源,顺便检查下有没有开启循环播放动画.

image-20221216155823086

image-20221216155920146

给角色添加武器

打开角色骨骼,找到左手,将剑资源拖入

image-20221216160510427

设置旋转和位置

image-20221216160626368

右手同上操作,右手剑的位置信息如下:

image-20221216160901397

运动动画

新建float参数speed,新建状态Run,附加上动画,通过make Transition建立状态过渡连线,两端都建一条箭头.

image-20221216175120672

image-20221216180018321

选中Idle->Run的箭头,接下来看图,关闭Has Exit Time

image-20221216175439241

image-20221216175917110

接着选中Run->Idle箭头,关闭Has Exit Time,设置状态过渡用时和过渡时机.

image-20221216182517576

回到character.cs脚本中,添加一个动画控制器变量,CalculatePlayerMovement方法中,为Speed赋值.

image-20221217165641230

image-20221217165718101

下落动画

动画控制器中新建一个bool变量airBorne

image-20221217171320279

确保动画是循环播放

image-20221217171512579

新建状态Fall,由Any State指向Fall

image-20221217172212304

选中该箭头,注意has Exit Time不选中,因为我们要立即执行

image-20221217172310387

拉到最下,连接AirBorne参数为true时进行下落状态

image-20221217172317278

同理Fall->Idle状态设置如下:

image-20221217172536563

image-20221217172527159

接下来回到character脚本,CalculatePlayerMovement方法中添加一条代码控制AirBorne参数.

image-20221217174546466

回到编辑器运行测试,我发现下落和落地后的动作过于僵硬,所以把上面的两个状态之间的过渡都调成了0.1;

image-20221217180135673

image-20221217180208520

脚步视觉特效

新建一个空对象命名为VFX,然后资产文件中找到脚步特效prefab,拖入其中

image-20221221151449669

image-20221221151636802

评论