P2L2——Lowpoly风格
P2L2——Lowpoly风格 Lowpoly 所谓的Low Poly,简单的说,就是3D模型的低精度表现形式。 早期的电脑硬件水平不发达,运算3D模型的时候无法达到现在这样的精细程度,为了提高运转速度,所以降低模型的面数。 如今随着独立游戏的风靡,因为成本的原因再次启用了这种风格,反而效果非常好。 PS1的《古墓丽影》 独立游戏《枪火重生》 美术特点 模型的面数较低 贴图使用纯色 能看到明显的面与面的交接 美术风格优势 难度低,入门简单 B站和YouTube的教程较多 资源量小,包体小 面数低,贴图少,帧率高 3D,玩法不受限制 风格稳定,来源不同的Lowpoly美术资源可以一起使用 商店这类风格的资源多 动画制作方面难度降低 可搭配3D场景模型、3D特效,3D动作使用(mixamo) 有较多方向可以做进阶提升 美术风格提升方向 原画设计、造型、色彩 Shader和材质:PBR、描边 部分手绘:脸部、衣服、装饰 细节增加 动作
P2L1——路点和寻路
P2L1——路点和寻路 塔防游戏的敌人需要沿着固定的路线行走,因此敌人需要沿着路点进行寻路 在场景上设置一些路点,敌人会主动向路点直线移动,走到路点后就转向另一个路点移动,直到遍历所有路点 例如下面的场景,Cube需要沿着这几个路点依次进行移动: 这里的实现思路是: 所有的路点被一个父对象管理,路点父对象挂载一个获取节点位置和节点数量的脚本Path Cube挂载寻路脚本PathFind,寻路脚本和路点父对象的Path关联, 通过得到的路点位置移动,到达点就切换到下一个路点,直至遍历所有路点 Path.cs 123456789101112131415161718192021222324252627282930using System.Collections.Generic;using UnityEngine;//管理所有路点,对外提供其位置,以及管理的路点数量public class Path : MonoBehaviour{ //通过列表管理各个路点 List<Transform> nodeList = new...
UG1SL1——编辑器模式下执行脚本
UG1SL1——编辑器模式下执行脚本 本章代码关键字 1[ExecuteAlways] //该特性会使脚本即使是编辑模式下(即使没有运行场景)也能执行 始终执行特性 [ExecuteAlways]这个特性可以让当前脚本即使是编辑模式下(即使没有运行场景)也能执行 123456789[ExecuteAlways] //这个特性可以让当前脚本即使是编辑模式下(即使没有运行场景)也能执行public class Lesson_ExecuteAlways : MonoBehaviour{ private void OnGUI() { print("OnGUI"); }}
UG1L10——GUILayout
UG1L10——GUILayout 本章代码关键字 1234567891011121314GUILayout //由它绘制的UI控件会自动布局,由它绘制的GUILayout.BeginArea() //确定自动布局的位置和可见范围GUILayout.EndArea() //一定是与GUILayout.BeginArea()成对出现!将需要确定自动布局的位置和可见范围的部分包裹起来GUILayout.BeginHorizontal() //使控件横向布局GUILayout.EndHorizontal() //一定是与GUILayout.BeginHorizontal()成对出现!将需要横向布局的UI绘制部分代码包裹起来//下面的函数都可以传入到GUILayout的UI控件绘制参数内,原来控制控件的样式GUILayout.Width() //控件的固定宽GUILayout.Height() //控件的固定高GUILayout.MinWidth() ...
UG1L9——GUISkin
UG1L9——GUISkin 本章代码关键字 12345GUI.color //GUI全局着色颜色GUI.contentColor //文本着色颜色GUI.backgroundColor //背景着色颜色GUISkin //可以关联GUISkin文件,赋值给GUI.skinGUI.skin //设置修改默认的GUI控件样式,即不传入GUIStyle的UI控件的绘制都会有影响 全局颜色 GUI.color 是全局的着色颜色,影响背景和文本颜色,包括对style的影响,可以再该改回去 GUI.contentColor 是文本着色颜色(受到全局着色指令的影响 会与全局颜色做乘法) GUI.backgroundColor 是背景着色颜色(受到全局着色指令的影响 会与全局颜色做乘法) 1234567891011121314151617GUIStyle style;private void OnGUI(){ //全局的着色颜色...
UG1L8——窗口相关
UG1L8——窗口相关 本章代码关键字 123GUI.Window() //绘制窗口GUI.ModalWindow() //绘制模态窗口,可以让该窗口以外的其他可见控件不再有用GUI.DragWindow() //可拖动窗口 窗口 第一个参数是是窗口的唯一ID,不要和别的窗口重复!如果窗口id相同,则上一个窗口会被顶掉 第二个参数是用于绘制窗口用的委托函数,要参数为 int 无返回值的函数,传入的参数是窗口的ID 第三个参数是窗口的标题 不同窗口调用相同委托参数,委托函数可以传入窗口的id来做不同的处理,如果窗口id相同,则上一个窗口会被顶掉 123456789101112131415161718192021222324252627private void OnGUI(){ //第一个参数 id 是窗口的唯一ID 不要和别的窗口重复 //第二个参数 是用于 绘制窗口用的委托函数 传入即可 //第三个参数 是窗口的标题 GUI.Window(1, new Rect(100, 100, 200, 150),...
UG1L7——滚动视图和分组
UG1L7——滚动视图和分组 本章代码关键字 1234GUI.BeginGroup() //开始分组,传入位置,它将决定接下来的UI控件绘制是在相对于哪个位置绘制,以及UI控件的显示的范围GUI.EndGroup() //结束分组GUI.BeginScrollView() //开始绘制滚动列表GUI.EndScrollView() //结束绘制滚动列表 分组 用于批量控制控件的位置,可以理解为包裹着的控件加了一个父对象 可以通过控制分组来批量控制被包裹控件的位置 根据分组传入的位置和尺寸,决定了接下来的UI控件绘制是在相对于哪个位置绘制,以及UI控件的显示的范围 1234567891011121314151617public Rect groupPos;private void OnGUI(){ #region 分组 /* 用于批量控制控件的位置 * 可以理解为 包裹着的控件加了一个父对象 * 可以通过控制分组来批量控制被包裹控件的位置 */ ...
UG1L6——工具栏和选择网格
UG1L6——工具栏和选择网格 本章代码关键字 12GUI.Toolbar() //绘制一组工具栏GUI.SelectionGrid() //绘制选择网格,相比工具栏可以限制单行显示数量,达到上限就换行 工具栏 GUI.Toolbar 会绘制一系列按钮作为工具栏,工具栏可以帮助我们根据不同的返回索引,来处理不同的逻辑 第二个参数传入当前索引值,第三个参数传入每个选项的名字,返回这一帧工具栏选择的选项, 因此和 GUI.Toggle 一样,必须要在外面声明一个 int 变量,用来存储当前工具栏选择了什么选项的索引 12345678910111213141516private int toolbarIndex = 0;private string[] toolbarInfos = new string[] { "选项一", "选项二", "选项三" };private void OnGUI(){ toolbarIndex =...
UG1L5——图片绘制和框
UG1L5——图片绘制和框 本章代码关键字 12GUI.DrawTexture() //绘制图片GUI.Box() //绘制框 图片绘制 GUI.DrawTexture 用来绘制图片,与Label不同,修改它的宽高不会导致等比例缩放 第一个参数 Rect:位置大小 第二个参数 Texture:图片 第三个参数 ScaleMode:缩放模式 StretchToFill:始终填充满 ScaleAndCrop:通过宽高比计算图片,但是会进行裁剪 ScaleToFit:根据宽高比进行计算,不会拉变形,会一直保持图片完全显示的状态 第四个参数 alpha:控制图片是否开启透明通道 第五个参数 imageAspect:自定义宽高比,不填默认为0,就会使用的默认图片宽高 123456789101112131415public Rect texPos;public Texture tex;public ScaleMode mode = ScaleMode.StretchToFill;public bool alpha...
UG1L4——输入框和拖动条
UG1L4——输入框和拖动条 本章代码关键字 1234GUI.TextField() //绘制输入框,传入当前字符串和最大输入的字符串的长度,返回这一帧输入框内的字符串GUI.PasswordField() //绘制密码输入框,传入当前字符串、要用什么字符来挡住密码字符串和最大输入的字符串的长度,返回这一帧输入框内的字符串GUI.HorizontalSlider() //水平输入框,第二个参数代表当前的值,第三个和第四个分别代表最小值到最大值,返回这一帧拖动条对应的值GUI.VerticalSlider() //垂直输入框,第二个参数代表当前的值,第三个和第四个分别代表最小值到最大值,返回这一帧拖动条对应的值 输入框 普通输入 GUI.TextField 是绘制输入框的方法, 第二个参数传入当前的字符串,第三个参数传入最大输入字符串的长度,返回这一帧输入框内的字符串, 因此和 GUI.Toggle 一样,必须要在外面声明一个 string 变量,用来存储当前输入框内的字符串 123456789private string...