![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Unity游戏开发
文章平均质量分 67
清木Moyu
这个作者很懒,什么都没留下…
展开
-
Amplify Shader Editor手册 Unity ASE(中文版)
Amplify Shader Editor手册 Unity ASE教程翻译 2022-08-07 03:23:53 · 11818 阅读 · 2 评论 -
Unity中C#单例模式使用总结
一、单例模式优点单例模式核心在于对于某个单例类,在系统中同时只存在唯一一个实例,并且该实例容易被外界所访问; 意味着在内存中,只存在一个实例,减少了内存开销;二、单例模式特点只存在唯一一个实例; 提供统一对外访问接口,使得全局可对该单例的唯一实例进行访问; 自行实例化(私有构造函数,不允许外界对其进行实例化)。三、单例模式使用资源管理器,资源对象数据的加载和卸载(无状态不需要实例化的对象); 单一客户端连接服务器等; 生命周期在游戏中永不消毁的对象。四、单例模式注意点原创 2021-09-28 00:49:59 · 376 阅读 · 0 评论 -
Unity使用System.Data.dll报错
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' and 'netstandard, Version=2.0.0.0版本不统一造成的,打开工程文件下的Assembly-CSharp.csproj,搜索System.Data,找到下面2处// 项目中使用的System.Data.dll,你自己存放的<Reference Include="System.Data"> <HintPat原创 2021-09-27 15:15:03 · 1156 阅读 · 0 评论 -
Unity 引入sqlite依赖dll时 报错Loading assembly failed “Assets/Plugins/Mono.Data.Sqlite.dll“解决方法
问题描述:在引入sqlite依赖dll出现以上错误:mono.data.sqlite.dll和system.data.dll解决方法:导入的dll和unity内部编译器的target版本应该有差异,网上分享的都是各自版本的dll,不一定适用,到unity目录下 \Editor\Data\MonoBleedingEdge\lib\mono\unityjit 文件夹下,复制所需文件到Asset/plugins覆盖旧的报错dll,错误即可消除:...原创 2021-09-27 14:33:27 · 1490 阅读 · 0 评论 -
【Unity SurfaceShader】学习笔记(八)光照模型
LitSphere(Matcap)发光球体光照模型就是将发光球体的纹理映射在球体上,来实现光照效果。这可以创造一些效果细腻的发光球体效果,但是它不受光照影响,改变光照的方向,球体的光照效果不变。如果要在固定视角的场景里制作细腻的球体光照,这会是一个不错的选择。准备小球纹理贴图: 定义Properties: Properties { _MainTint ("Diffuse Tint", Color) = (1,1,1,1) .转载 2021-09-26 16:40:39 · 516 阅读 · 0 评论 -
【Unity SurfaceShader】学习笔记(七)镜面反射
Unity内置的高光函数Unity内置了一种高光光照模型——BlinnPhone。使用方法如下:Shader "Custom/BlinnPhong"{ Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _MainTint ("Diffuse Tint", Color) = (1,1,1,1) _SpecColor ("Specular Color", Color) = (1转载 2021-09-26 16:38:56 · 1052 阅读 · 0 评论 -
【Unity SurfaceShader】学习笔记(六)Cubemap
Cubemap是一种类似天空盒的由六张贴图组成的贴图。它是用于一些需要反射效果的材质,用来反射周围的环境。如果要表现金属材质,通常会给它添加一张反射贴图,来模拟金属表面反射的环境的颜色。因为金属之类的材质它本身其实是没有颜色的,它的颜色就是它反射的周围物体的颜色。如果给金属赋予银白色,并不能得到金属的质感,要让它反射周围的颜色。立方图就是这样一种记录了周围环境颜色的贴图。Unity提供了一个RenderToCubemap的方法在脚本中生成Cubemap,官网代码.将代码拷贝下来,然后在场景中随意地搭个场转载 2021-09-26 16:28:37 · 2026 阅读 · 0 评论 -
【Unity SurfaceShader】学习笔记(五)法线贴图
法线贴图是一种在低模上模拟高模的效果的技术。这是维基对它的介绍。法线贴图类似凹凸贴图的升级版,凹凸贴图记录了物体表面凹凸的情况,法线贴图记录了物体表面凹凸的光照信息。光照信息即是入射光与法线的夹角信息。为了提高性能,模型的面数越少越好,很多细节的东西都是用贴图去弥补。但是光照是基于顶点去计算的,这样高光阴影等光照的表现就不够真实。于是前辈们发明了法线贴图这个办法,用贴图记录表面的光照信息,也就是用RGB值存储法线坐标的XYZ值,使低模也能够有高模的光照信息,从而表现出高模的光照效果。这是一种存储空间换计转载 2021-09-26 16:21:01 · 1185 阅读 · 0 评论 -
【Unity SurfaceShader】学习笔记(四)混合纹理
混合纹理纹理混合就是将几张纹理重合在一起显示。最常见的情形是地形纹理。混合纹理可以优化性能,这样只要渲染一次混合后的纹理即可,而不必渲染多次。接下来要介绍的就是如何混合纹理制作地形着色器:先准备几张贴图:这几张就是要混合图片。我们还需要下面这张图片,这张图片就决定了图片是如何混合的:(可以先转到后面看效果)好了,上代码(我还是直接贴全部吧):Shader "Custom/Textures" { Properties { _MainTint (转载 2021-09-26 16:13:40 · 813 阅读 · 0 评论 -
【Unity SurfaceShader】学习笔记(三)让纹理动起来
让纹理动起来通过更改Input结构体里UV坐标,我们可以让纹理动起来。这是一段河流的简易Shader:Shader "Custom/ScrollUVs" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} _ScrollXSpeed ("X Scroll Speed", Range(0, 10)) = 2 _ScrollYSpeed ("Y Scroll S转载 2021-09-23 19:31:42 · 300 阅读 · 0 评论 -
【Unity SurfaceShader】学习笔记(二)用纹理改善漫反射
用纹理改善漫反射上一篇里我们做的HalfLambert的效果是这样的:我们看到,亮部到暗部没有自然的过渡,暗部直接涂成深灰。就像初学者画的素描,直接将暗部涂黑,没有变化。这是因为这种光照计算太简单了,现实生活中,暗部因为漫反射的存在不会像画面上那么暗。但如果要引入光照计算的话,那太复杂了,我们可以用纹理来改善它。因为我们需要一张纹理贴图,先在Properties里声明纹理:_RampTex ("Ramp Texture", 2D) = "white"{}然后再CGPROGRAM转载 2021-09-23 17:36:50 · 322 阅读 · 0 评论 -
【Unity SurfaceShader】学习笔记(一)认识结构
认识结构创建SurfaceShader1. 新建Unity Project。2. 在Assets文件夹下新建三个文件夹:Materials、Shaders、Textures。3. 在Shaders文件夹下右键,Create-Shader-Standard Surface Shader,命名为MySurfaceShader。4. 在Materials文件夹下新建Material,命名为MySurfaceShader,将它的Shader改为新建的Shader。5. 新建一个Cube,将新建的材质转载 2021-09-23 15:41:32 · 611 阅读 · 0 评论 -
Unity3d 移除某个GameObject的所有子物体
在开发游戏的时候,经验会遇到这样的需求:移除某个物体下面的所有子物体,比如排行榜列表的刷新,清空某个列表等。虽然Unity3d提供了一些现成的API可以操作,但是要正确移除一个物体下的所有子物体,还需要注意一些问题通过Transfrom的childCount属性可以获取当前物体有多少个子物体parent.transform.childCount通过transform.get(index)方法返回的是子物体的transform,直接移除是不对的Transform transform;f.原创 2021-09-10 18:25:43 · 3134 阅读 · 0 评论 -
Unity 中的 SetActive() 、 OnEnable()、OnDisable()
一、Unity 3D中的 GameObject.SetActive() 与 MonoBehaviour.OnEnable()、MonoBehaviour.OnDisable()其实这三之前的关系很简单:SetActive(true),很触发MonoBehaviour.OnEnable()事件,就算对象之前本就是activeSelf==true,事件依然会发生;SetActive(false),很触发MonoBehaviour.OnDisable()事件,就算对象之前本就是activeSelf==f原创 2021-09-10 18:20:36 · 4468 阅读 · 1 评论 -
用VScode开发Unity心得,和一些必备插件
自从用了半个月的vscode 感觉要起飞了,功能相当强大,从来没有过的感觉,能吧他哥哥visualstudio甩十条街。安装的之后要翻墙,他会自动下载一些所需要的包接下来我介绍一些插件C# XML Documentation Comments快速生成代码注释头/// <summary>/// 说明/// </summary>Bracket Pair Colorizer让你的括号有属于自己的颜色提高开发效率C#这个是必备的不...转载 2021-08-30 12:13:18 · 3886 阅读 · 1 评论 -
Unity绘制圆、椭圆、多边形
unity画圆原理是绘制多边形,增加多边形的边数,当边数到达一定的数量后,看起来就是一个光滑的圆using System.Collections;using System.Collections.Generic;using UnityEngine;//该物体需要 LineRenderer组件,也可以手动添加LineRenderer组件,把这个注释掉[RequireComponent(typeof(LineRenderer))]public class CirclesDrawer : Mo.原创 2021-04-23 16:57:25 · 4474 阅读 · 0 评论 -
TapTap物理画线游戏,使用Unity实现2D物理画线功能
实现效果如下:本工程已上传到GitHub,感兴趣的同学可自行下载学习。GitHub地址:https://github.com/linxinfa/UnityPhysicsDrawLine物理画线的核心就是:物理+画线。物理:想要有物理特性,最简单的做法就是挂碰撞体(Collider)和刚体(Rigidbody)组件。画线:可以使用LineRenderer组件来实现画线功能。1、创建物体挂组件创建一个空物体,重命名为Line,挂上EdgeCollider2D、Rigid.转载 2021-04-22 03:14:49 · 1342 阅读 · 0 评论 -
Unity下,移动撞墙后抖动的解决方案
Unity下的移动方案:1.Rigidbody.MovePosition2.Rigidbody.AddForce3.Transform.Translate;Transform.position = vector3;目前主要分这三大类的移动方式。1和2是物理移动方式3是实体对象坐标的移动方式然后说说题目,为啥会抖动呐:public class Test : MonoBehaviour{ public float m_nSpeed = 0; void Update转载 2021-04-22 03:06:21 · 2493 阅读 · 4 评论 -
Unity粒子系统图片材质制作
先创建材质球:文件夹下右键->Create->Material编辑材质球:Shader->Legacy Shaders->Particles->Alpha Blended颜色就选择默认的RGBA(128,128,128,128),不要修改,Texture选择需要的图片即可做好材质后把它拖到粒子中的 Renderer->Material 即可...原创 2021-03-10 16:27:25 · 4111 阅读 · 0 评论 -
Unity粒子系统
一、粒子系统主界面:二、粒子系统下各个子模块: Main module//主要模块 Emission//发射 Shape//形状 Velocity Over Lifetime//粒子在生命周期内的速度 Limit Velocity Over Lifetime//粒子在生命周期内的极限速度 Inherit Velocity//速度继承 Force Over Lifetime//粒子在生命周期内的受力 Color Over Lifetim...转载 2021-03-10 11:10:22 · 4556 阅读 · 0 评论 -
Unity 使用物理射线(Physics.Raycast),实现扇形区域碰撞检测三种方法
方法1:实现原理:(lookAngle / 2) / lookAccurte 很简单,就是射多几条角度平均的射线。可以设置角度,精度(射线数量),来调节扇形区域的检测。每条射线夹角是总夹角处于2,再除于精度。 1. 默认是射出一条向前的射线,精度为0。2. 设置角度为90,精度为1,就会多出两条相对正前方45度的射线。3.设置精度为2。实现代码//放射线检测private bool Look(StateController...转载 2021-02-26 16:22:44 · 5217 阅读 · 0 评论 -
Unity3D 本地数据持久化记录存储
下面介绍几种 Unity本地记录存储的实现方式。第一种 Unity自身提供的 PlayerPrefs//保存数据PlayerPrefs.SetString("Name",mName);PlayerPrefs.SetInt("Age",mAge);PlayerPrefs.SetFloat("Grade",mGrade)//读取数据mName=PlayerPrefs.GetString("Name","DefaultValue");mAge=PlayerPrefs.GetInt(转载 2021-01-24 02:05:18 · 452 阅读 · 0 评论 -
Unity 对象池
概念我们先讲讲对象池是什么,有什么用。在游戏的制作过程中,我们可能会碰到这样的情况,就像现在最火的吃鸡游戏一样,我们有一把枪,开枪的时候射出子弹。每个子弹即一个对象,正常情况,我们的处理方式可能会是,每开一枪,就GameObject.Instantiate()一个新的子弹,当子弹到达极限距离的时候再GameObject.Destroy()销毁它。假设有射出1000发子弹,我们就会执行1000次这样的操作,然而在Unity中Instantiate和Destroy操作,不仅影响性能还容易产生内存碎片,总之就转载 2021-01-14 14:35:34 · 203 阅读 · 0 评论 -
简单理解与使用对象池模式(unity中实现)
一、对象池概念对象池模式并不是游戏开发独有的设计模式,它的设计思路与其他开发中的数据库连接池、线程池的思路等是一样的。其核心思想是,使用完不直接删除,而是将其放回池子里,需要用的时候再取出来。 对象池模式的出现主要优化两点:1、防止对象被频繁的创建和删除,从而内存抖动、频繁GC(垃圾回收)2、对象初始化成本较高但是因为传统软件开发的对象通常都是轻中里量级的, 分配/释放对象的开销可以忽略不计,所以所以在传统的软件开发中朴素的对象池应用还是比较少的。一般都是特定对象为了②上优化,例如.转载 2021-01-14 10:54:44 · 296 阅读 · 0 评论 -
Unity项目的.gitignore配置
Unity项目只需要关注Assets、ProjectSettings、Packages三个文件夹的版本控制。最新版的Unity基本已经将设置默认为可版本管理状态。我使用的版本是Unity2019.4.13。如果不放心,大家可以自行查看一下这两个配置的地方是否正确。Edit --> 项目设置 --> 编辑器确保如下图两项设置正确:最后让我们在项目中创建.gitignore文件:[Ll]ibrary/[Tt]emp/[Oo]bj/[Bb]uild/[Bb]uilds/转载 2021-01-09 01:41:55 · 3737 阅读 · 1 评论 -
Unity FBX模型动画提取
角色已经人形化(Humanoid)了,那它的动画可以用在其它的模型上了也就是可以共用一套模型动画了,但是你有没有发现那动画是和fbx模型绑在一起的,没关系你可以选中这几个动画文件按Contrl+D就可以提取出来了,然后你可以把整个fbx模型都删掉了,新生成的动画已经不再基于fbx了,这样可以大大减小资源大小。using UnityEngine;using UnityEditor;using System.Collections;using System.IO; public cl...原创 2021-01-05 15:50:51 · 2849 阅读 · 1 评论 -
Avatar Mask 动画混合
Unity关于动画,大致分为动画融合动画混合。具体使用到的东西大概就是BlendTree和Avatar Mask前者主要解决类似跑的时候转向这种问题,而后者是用来解决诸如边跑边招手,或者攻击的问题。这里主要记录一下Avatar Mask的使用心得。首先先创建Animator Controller,双击打开Animator Controller,添加你所需要的动画,在左侧layer层可以看到默认的是只有一个Base Layer的(layerIndex起始值为0,也就是0层),在这层添加诸如走路这些基础转载 2021-01-04 18:04:23 · 605 阅读 · 0 评论 -
Unity中协程(IEnumerator)的使用方法介绍
在Unity中,一般的方法都是顺序执行的,一般的方法也都是在一帧中执行完毕的,当我们所写的方法需要耗费一定时间时,便会出现帧率下降,画面卡顿的现象。当我们调用一个方法想要让一个物体缓慢消失时,除了在Update中执行相关操作外,Unity还提供了更加便利的方法,这便是协程。在通常情况下,如果我们想要让一个物体逐渐消失,我们希望方法可以一次调用便可在程序后续执行中实现我们想要的效果。我们希望代码可以写成如下所示:void Fade(){ for (float f = 1f; f >..原创 2020-12-30 11:43:58 · 167 阅读 · 0 评论 -
Unity 第三人称射击游戏视角控制与武器瞄准
===================更新一下源工程链接:链接:https://pan.baidu.com/s/15bxH-MPregp2ZIN92fK7XA 提取码:e7bp===================(与本文相比有修改)效果视频演示:https://www.bilibili.com/video/av88249417完整代码在最下面最近练习Unity,想做一个第三人称射击游戏的Demo。首先来做一个武器瞄准效果,即让枪能指向目标。查了很久不知道怎么实现,后来查到了IK这个概念,转载 2020-12-28 18:22:02 · 3829 阅读 · 1 评论 -
Unity中协程(IEnumerator)的使用方法介绍
在Unity中,一般的方法都是顺序执行的,一般的方法也都是在一帧中执行完毕的,当我们所写的方法需要耗费一定时间时,便会出现帧率下降,画面卡顿的现象。当我们调用一个方法想要让一个物体缓慢消失时,除了在Update中执行相关操作外,Unity还提供了更加便利的方法,这便是协程。在通常情况下,如果我们想要让一个物体逐渐消失,我们希望方法可以一次调用便可在程序后续执行中实现我们想要的效果。我们希望代码可以写成如下所示:void Fade() { for (float f = 1f; f >转载 2020-12-11 17:25:49 · 275 阅读 · 0 评论 -
Unity——实体组件ECS与Jobs System
Unity2018版本提供了ECS和Jobs System功能,网上也有很多这方面的技术介绍,本篇博客从Unity架构优化的角度给读者介绍关于ECS和Jobs System的使用,结合着实际案例希望让读者更容易理解它们,尤其是在IT游戏行业工作了两年以上的开发者,更应该掌握一些架构技术。Unity 实体组件系统和 C# Job System 是两个不同的系统,但它们密不可分,若要了解这两个系统,...转载 2019-09-10 11:02:50 · 533 阅读 · 0 评论 -
Unity游戏开发笔记——Vector2
transform.rotation * new Vector3 (1, 0, 0) : 该脚本对象局部x轴所代表的全局方向向量transform.rotation * new Vector3 (0, 1, 0) : 该脚本对象局部y轴所代表的全局方向向量transform.rotation * new Vector3 (0, 0, 1) : 该脚本对象局部z轴所代表的全局方向向量u...原创 2019-09-09 18:53:27 · 2065 阅读 · 0 评论 -
Unity游戏开发笔记
Context全解析Context到底是什么Context的中文翻译为:语境; 上下文; 背景; 环境,在开发中我们经常说称之为“上下文”,那么这个“上下文”到底是指什么意思呢?在语文中,我们可以理解为语境,在程序中,我们可以理解为当前对象在程序中所处的一个环境,一个与系统交互的过程。比如微信聊天,此时的“环境”是指聊天的界面以及相关的数据请求与传输,Context在加载资源、启动Acti...转载 2019-09-02 19:28:38 · 337 阅读 · 0 评论 -
Entitas学习三 —— Entitas 基本思想
1. Entitas的主要思路如果你熟悉ECS的话,可以很容易就理解这个框架,不熟悉也没关系,我们一起来熟悉。Entitas的思路比较明确——谁发生了改变,我就对谁感兴趣。比如角色的血量,如果它没有变化,那么,System是不会对其进行操作的(当然,你想操作也行)。只有血量发生了变化,它才会被关注。当然了,像监测血量变化这种事情,我们用消息订阅就能完成,只不过Entitas把这件事...转载 2019-08-28 11:24:42 · 1262 阅读 · 1 评论 -
Entitas学习二 —— Entitas 入门
1. Entity(实体)、Component(组件)、System(系统)间的关系如果你觉得想尽快看到HelloWorld,那就直接从第2步开始,然后再回来看这一步吧。这里简单介绍ECS三者之间的关系。Entity,即实体,显然,它是一个实质的带有功能的对象,但它又不仅限于角色、怪物这些实体。因为,在Entitas中,就连鼠标点击产生的事件也作为实体。组件就是一些...转载 2019-08-28 11:23:00 · 884 阅读 · 0 评论 -
Entitas学习一 —— Entitas下载安装
第1步 - 准备新的Unity项目创建并打开一个新的Unity项目。然后转到Unity工具栏并选择Assets> Open C#Project。这将打开与Unity关联的默认代码编辑器,并生成Entitas所需的脚本程序集。然后,您可以关闭或最小化编辑器,因为我们在安装过程中不需要它。注意:某些外部编辑器不会自动生成.csproj文件(例如Visual Studio,emacs,...转载 2019-08-27 18:12:18 · 1017 阅读 · 0 评论 -
unity游戏开发之entitas框架
组件-实体-系统 (ECS \CES)游戏编程模型:组件一个组件可以使用C中的结构体来进行设计。它没有方法,只是用来存储一些数据,并不在它之上进行动作。一个经典的实现方式是,每一个不同的组件都继承至一个抽象的Componet类,通过这样的方法我们能够在运行时动态的添加组件,识别组件。每一个组件都描述了实体的某个属性特征。当他们单独存在的时候,实际上是没有任何意义的,但是当多个组件通过系统的...转载 2019-06-18 10:43:47 · 2045 阅读 · 0 评论 -
浅析Unity的C# Job System
一、 C# Job System多线程使程序更高效,但是想要实现多线程需同时避免频繁的上下文切换、线程的资源的竞争What is a job system?通过创建一个Jobs代替线程来管理多线程代码将jobs 放入job queue中执行,job system中的工作线程从job queue中提取并执行它们job system管理依赖项并确保jobs以适当的顺序执行。What i...转载 2019-09-10 11:06:16 · 261 阅读 · 0 评论 -
Unity——ECS 高性能探索详解
前言本文是前篇《十分钟上手Unity ECS》的续作,着重对高效与性能的特点进行讲解。不管是接触过Unity的ECS,想要继续深入了解;或者是没接触过但想了解这部分高性能的一些原理,都不妨碍阅读本文。跟前篇一样,本文将围绕一个小Demo,对比说明ECS的方式与旧版实现方式在编程思想以及代码编写上的特点和原因。Demo内容球球雨——2w个球自由落体,掉到底就回到顶部,如此不断循环,像下雨一样。...转载 2019-09-10 11:14:22 · 1825 阅读 · 0 评论 -
Unity——浅谈Unity ECS结合Job System详解
前言本文是上一篇《Unity ECS 高性能探索》的续篇。在上一篇,我们用ECS实现了PC下同屏2w个球体,编辑器下跑到了120FPS。而在本篇,我们把性能继续解放,加上Job System,把同屏推进到8w个球体,60FPS。性能瓶颈我们先来看一下上一篇实现的ECS同屏2w个球体,如果加到8w个会怎么样只有不到40FPS,上一篇里我们提到了,开启GPU Instancing以后,性能热点从提...转载 2019-09-10 11:17:43 · 3417 阅读 · 1 评论