上周我利用一周的时间完成了一个解密竞速小游戏,这也是没空更新的一个原因吧
因为时间比较短,就选择了2D项目来练练手,在人物角色控制写完了之后,就想着写个摄像机来控制视野,索性就想到了Cinemachine,记得之前好像看到Cinemachine有一套比较好用的摄像机系统,就拿来试试了。
效果预览
可以看到其效果包含以下几个方面
跟随玩家角色的移动
在小范围内移动不会触发摄像机位置的改变
摄像机缓动
摄像机视野不会超出地图范围
这几个效果自己手写还是挺麻烦,让我们来看看Cinemachine怎么做。
如何使用
创建一个2D虚拟相机:
2. 为虚拟相机指定Flow 3. 设置活死区和插值 此时已经可以实现摄像机跟随了,但是此时摄像机可能会照到非地图区域4. 设定地图碰撞区域 创建一个空物体并挂载多边形碰撞器(目前只支持这种类型的碰撞器)记得设置为触发器 为虚拟相机添加如下组件,将碰撞设置进去 此时你可以实现上述的所有功能了。
算法设计
Unread
对A*算法早有耳闻,但一直未细致去分析过,最近重新看到这个概念,来尝试分析一波
算法定义A* 算法常被表示为 f(n)=g(n)+h(n)
**f(n)**表示从状态n到达目标状态的花费的预测值**g(n)**表示从初始状态到达状态n的花费**h(n)**表示从状态n到达目标状态的花费预测值(最佳路径)
拖了蛮久了,差点我都忘记了我还有个博客等着我每周一更呢。
效果预览
A* 格子数据123456789101112131415161718192021222324252627282930313233343536373839404142434445464748namespace FastyTools.Astar{ /// <summary> /// 格子类型 /// </summary> public enum NodeType { Walk, /// <summary> /// 障碍物 /// </summary> ...
快速食用
下载inky编辑器
编写ink文件
下载安装unity支持
找到ink示例,将对应的ink 生成的json导入运行游戏即可。
unity使用流程在unity中,我们需要通过代码来驱动我们的剧情的进行。
首先我们需要创建至少2种Prefab,一种表示文字,一种表示按钮。
然后我们需要创建一个story对象,载入对应的json文件story = new Story (inkJSONAsset.text);
判断story能否继续,若能继续使用代码创建对应的游戏对象
1234567891011121314151617181920212223242526272829while (story.canContinue){// Continue gets the next line of the storystring text = story.Continue ();// This removes any white space from the text.text = text.Trim();// Display the text on screen!Create ...
本来说好的每周一更又鸽了…今天来水一期,介绍一款很棒的剧情编排应用 YarnSpinner。
介绍YarnSpinner是一款开源免费的剧情编排应用(或者说是一种用于剧情编排的标记语言)。试想我们在开发游戏时,剧情有分支选择,有各种条件检查,如果我们全在代码中去判断和检查不仅繁杂而且非常麻烦,策划学习成本高,耦合性过强。你可能自己想出一套标记语言来表述剧情流程,但自己的力量毕竟是有限的,难免出现一些bug和坑。此时,不妨试试这款免费开源,多人共同维护的应用吧。
快速食用代码式编辑这里我使用vscode作为编辑器,下载一下插件:
我们先创建一个.yarn格式的文件,并写入以下内容:
1234567891011title: cctags:colorID: 0position: 1,-22---Fasty97: HiPC: 你好?!Fasty97: 我又回来了!PC: 是忘了什么东西吗?===
这是一段剧本最基本的格式(一个yarn文件至少包含一段剧本):
1234title: cctags:colorID: 0position: 1,-22
以上被称为一个剧本头,表示一段剧本,这些是一些 ...
Unity版本:2019.3.6f1
长文警告!!!
是否为摄像机脚本困扰?是否为镜头动画烦恼? Cinemachine 超强插件解决你的问题!
安装Cinemachine
现在Cinemachine作者已经投靠unity官方了,所以Cinemachine也成为了Unity的官方插件,我们可以直接在PackageManager中下载:
各类相机简述
安装之后我们可以在顶部菜单栏,看到如下的选项:
选项
说明
Virtual Camera
虚拟摄像机
FreeLook Camera
自由相机,可以保证镜头内出现头和身体,及相机的活动范围在目标周围圆柱(曲面的)表面,一般用于第三人称控制器
State-driven Camera
状态驱动相机。添加虚拟相机列表,可以在不同的相机直接直接实现平滑切换,同时其子相机列表如果没有设置LookAt对象等,会直接使用这个父相机的对象。
ClearShot Camera
干净镜头相机。类似上一个相机,区别在于这个相机可以通过判断子相机的CinemachineCollider ...
对象池:在对象销毁时将对象放入池中,在使用对象时从池中取出对象,避免对象初始化和销毁时的昂贵代价。
在游戏中我们需要很多的对象,这些对象可能是动态变化的,例如射击游戏中的子弹,是不断计数的,游戏中的特效也是随着游戏不断增加的。如果我们每次在使用时创建在消失时销毁,务必会造成很大的开销,使用对象池的概念我们可以初始化一定数量的对象在使用对象时使用池中的对象,在消失时把对象归还给对象池,实现对象的复用。
单例模板一般来说,对于全局的对象池我们需要一个全局的对象池管理器单例来管理所有的对象池。在unity中我们会用到2种单例,一种是非mono单例,一种是mono单例。
非mono单例纯粹的单例模式,添加了线程锁。
1234567891011121314151617181920212223242526using System;using System.Threading;namespace ObjectPool{ public class SingletonManager<T> where T:new () { private st ...
在很多编程语言中都支持协程,例如在我们之前提到的lua中,协程是一个虚拟的线程技术。
简述想一想我们平时购买电脑提及的,cpu是四核八线程,其实cpu原先只能处理处理一件事,也就是说cpu默认是一个核心对应一条线程的,但是如果我们需要同时处理多个任务,而我们并没有那么多的线程数量。然后前人们就提出了虚拟线程的概念,将cpu的单个线程,虚拟出多条线程,也就有了我们四核八线程,八核十六线程等的概念;在应用程序这边也有了线程和进程的概念,在把进程再细分,虚拟化软件的线程就得到了协程的概念。
至此你知道,协程就是对线程的再细分,是线程的再虚拟化即可。
unity的协程虽然说协程的概念并不新颖,但在现在大趋势的互联网开发领域可能很少涉及到协程这个词汇。协程就是协力去完成一件事,这很容易想到多线程的概念,例如我们进行一次网络请求我们需要等待response之后才能下一步操作,此时我们就会用到互斥锁、线程安全等概念。在unity中或者说在游戏引擎中,由于受到游戏主循环线程的制约,所以不能确保多线程的安全性,此时在同一线程下继续使用协程来承担多线程的工作就显得尤为重要。(unity也退出了以性 ...
很多第三人称角色扮演游戏都有一个很棒的角色摄像机
预览实现后的效果如下:使用鼠标即可以移动摄像机,摄像机能智能的检测到碰撞体,并自动修正位置。
备注Camera.fieldOfView 属性可以获取到摄像机的焦距,修改该值,可以实现拉进拉远效果。
核心参考123var mouseX = Input.GetAxis("Mouse X");var mouseY = Input.GetAxis("Mouse Y");Camera.main.transform.localRotation = Camera.main.transform.localRotation *Quaternion.Euler(-mouseY, mouseX, 0);
以上代码是将鼠标移动和摄像机位置关联起来的关键代码,首先我们取得鼠标的x和y轴上的axis值,然后将摄像机的旋转量*(-mouseY, mouseX, 0)构成的四元数。
1Quaternion.Euler(vector3)
可以将一个3维向量转换为一个四元数。
完整代码1234567891011121314151 ...
在游戏中,我们可能需要这样的效果,将一个物体放大2倍,在2s之内完成;或者在点击UI时将UI逐渐消失。这样需要多作用效果进行逐步展示的效果被称之为补间。
为了引出我们今天的主角DOTween,我们先来看看用unity的animation系统制作一个帧动画序列。
普通的动画我们需要以下几个步骤:
创建并录制动画
在Animator中设置
绑定按钮事件
代码部分:
123456private static readonly int Play = Animator.StringToHash("Play");public void StartAni(){ ui.GetComponent<Animator>().SetTrigger(Play); print("播放动画");}
我们需要既需要创建资源,有需要绑定设置,操作过程略微麻烦。
DoTween动画在DoTween中我们仅仅需要绑定好按钮事件即可,不要创建动画资源,设置动画播发器等麻烦事。这在轻度使用补间动画里是非常不错的。
12345 publ ...
概念ScriptableObject是unity提出的针对数据存储资源的解决方案,能够将数据配置项可视化的展示在unityd属性面板中,并且极易于json进行数据交互。个人使用过后觉得,其操作方式和继承非常类似,感觉像是对继承进一步封装使其更符合unity开发需要,让数据实体化,具现化的展示,通过拖拽式即可像拆装零件一般自由组合数据。(总而言之是对继承和多态的封装)
使用场景用于ScriptableObject是针对unity的,在unity使用时比传统的数据格式如json,xml更加方便快捷。而且在面对诸如策划,美工等不了解程序的人员来说,上手更加快捷。实质上,ScriptableObject主要还是对数据进行存储和处理,只要是使用数据的地方都可以使用ScriptableObject进行配置式管理,这样相比直接继承式的数据传递,耦合性更低。更符合多组合少继承的设计理念。
基本使用遵循步骤:
创建资源脚本,继承自UnityEngine.ScriptableObject
创建资源对象
在其他脚本中以组件形式指定资源对象
我们可以将一些诸如敌人的血量,攻击,防御等数值存储在Script ...











