学一个工具就像练一门功夫:Unity学习随记
从2011年开始,就已经在学习Unity了,那会儿看的一个教程,还跟着用javascript写完了,因为当时刚开始用它做项目嘛,想了解一下,还在日志里说,今后要“先技术政治”。后来随着项目开展,自然也跟着团队一起学习,用了很多版本,但主要精力还是放在设计和沟通上,除了对一些新概念在游戏中的应用熟悉以外,自己本身并没做太多的东西。
后来2012年,Unity免费版开放了手机的build,又看了一阵。再后来就是系统地看了官网所有的编程教程,包括最早更新的入门级和后来的中级。入门级感觉对我这种编程门外汉来说更有用一些,中级很多概念后来在自己试着开发小游戏时,都用不上,更准确的说,是想不起来用。一晃到了2014年,用Unity自己做了一个很简单的手游,代码写的惨不忍睹,玩法也很薄弱,但至少是逼着自己从头到尾实现了一个想法。
去年底以来,一直在尝试用Unity制作Oculus方面的应用和游戏,因为时间和惰性,进展也不大。年底的暑假期间,还抽空把一本以Unity为对象的讲解C#的书看了一遍,但感觉没什么大收获。此外也还集中把以前遗漏的寻路系统,动画系统,5.0的新UI系统的官方教程都看了一遍。
最近半年所学课程虽然没有用到Unity,但因为对这个软件的熟悉(相对于老师和同学而言),倒也有一些横向的思考和尝试(以前的日记有所提及)。
就我个人而言,学习Unity的经历大致如此,最近刚看完和做完官网的另一个教程,制作一个isometric视角的射击游戏,https://unity3d.com/learn/tutorials/projects/survival-shooter,觉得收获不小。这个游戏其实看起来还是比较复杂的,教程把资源的部分已经全部提前完成了,教大家的部分则集中于对这些资源的利用,以及一些关键代码的编写。
最好的一点是,讲解的三位Unity工程师,完全把听众当成了最初级的Unity和编程学习人士,对那些基本但又关键的概念进行重点讲解。这些内容中,有很大一部分和Unity4.6的新动画和UI系统有关。对于新的动画系统,这个教程最打开人眼界的地方是,作为一个状态机系统,它其实可以管理各种事件,比如UI动画的驱动,而并不是只限于角色动画。而动画编辑器,也可以对UI物件的所有参数进行关键帧编辑,这个流程和我最近一年用的After Effects非常类似。
在编程的框架方面,十分重要的一些要点包括,利用public static给一个class产生变量,比如分数这种全局性的,一旦生成后,就可以从这个类直接来调用,而不必去找特定的Instance物体。
在对Player和Enemy的互动,特别是attack造成damage这一块,这个教程的处理方式也很值得学习。
Enemy对Player的Attack,首先在Enemy身上挂这些代码:
void Awake ()
{
player = GameObject.FindGameObjectWithTag ("Player");
playerHealth = player.GetComponent <PlayerHealth> ();
...
}
这样的话,就能通过Player挂的Tag立即找到Player,并且这个Find是在Awake时做的,所以不费。(联想到我代码里那么多Find都在Update里面,简直要汗死)
然后在主循环里面跑一个对Enemy攻击速度的判定来决定Attack是否执行:
void Update ()
{
timer += Time.deltaTime;
if(timer >= timeBetweenAttacks && playerInRange && enemyHealth.currentHealth > 0)
{
Attack ();
}
...
}
如果执行的话,Attack是这么写的,首先,计时器清零,然后真正起作用的是,让Player下面挂的一个函数TakeDamage来执行,这里的关键来了,TakeDamage()是有参数的,TakeDamage (int amount),那么,正好,把EnemyAttack函数里的attackDamage丢进去,伤害造成了:
void Attack ()
{
timer = 0f;
if(playerHealth.currentHealth > 0)
{
playerHealth.TakeDamage (attackDamage);
}
}
我的那个小游戏压根就没用到过函数之间扔参数这么基本的事情,因为我不会用(一万个羊驼在心中冲撞。)但这个太基本了,不会的话,各个系统之间就很难进行消息和参数传递。(所以我的游戏很简单啊啊x100)。
再看Player这边,就没啥好说的了,他所挂的PlayerHealth这个脚本下面有一个函数叫做TakeDamage:
public void TakeDamage (int amount)
{
damaged = true;
currentHealth -= amount;
...
}
这个教程让我想起来最近用的Max7这个软件,它里面每个build-in的patch,或是网上下的其他人开发的external的patch,都有一个help文件,这个文件基本上包含了该patch的详细用例,而且最妙的是,用的也是max patch的形式,所以可以拷贝任何部分到自己的工程中直接去用。用老师的话来说,就是要当黑客,善于这里偷一点,那里改一点,来做东西。不过他也强调,能这么干的前提是,你至少要看懂别人写的是什么,否则连拷贝什么部分都是瞎摸,出问题也不知道怎么解决。也许将来游戏引擎也能做到这样,想要个什么功能,拖进来就能用,不会用还能立马给你一个能跑起来的小demo。不过想想也比较难,游戏跟这类纯艺术或是音乐作为产出的软件还是有本质不同,它的逻辑和资源是分开的。。所以无论如何,都没法像Max7这样,甭管再复杂的patch,老纸也能给你一页显示全了。
游戏引擎里,Unity算是门槛比较低的,但必须要会编程这一点着实要人老命。但是,编程为什么会要了老命呢,原因无非是,花的时间不够多呀!学习一个工具就像练一门功夫,Unity在进步,我们也跟着进步,进一寸是一寸。
后来2012年,Unity免费版开放了手机的build,又看了一阵。再后来就是系统地看了官网所有的编程教程,包括最早更新的入门级和后来的中级。入门级感觉对我这种编程门外汉来说更有用一些,中级很多概念后来在自己试着开发小游戏时,都用不上,更准确的说,是想不起来用。一晃到了2014年,用Unity自己做了一个很简单的手游,代码写的惨不忍睹,玩法也很薄弱,但至少是逼着自己从头到尾实现了一个想法。
去年底以来,一直在尝试用Unity制作Oculus方面的应用和游戏,因为时间和惰性,进展也不大。年底的暑假期间,还抽空把一本以Unity为对象的讲解C#的书看了一遍,但感觉没什么大收获。此外也还集中把以前遗漏的寻路系统,动画系统,5.0的新UI系统的官方教程都看了一遍。
最近半年所学课程虽然没有用到Unity,但因为对这个软件的熟悉(相对于老师和同学而言),倒也有一些横向的思考和尝试(以前的日记有所提及)。
就我个人而言,学习Unity的经历大致如此,最近刚看完和做完官网的另一个教程,制作一个isometric视角的射击游戏,https://unity3d.com/learn/tutorials/projects/survival-shooter,觉得收获不小。这个游戏其实看起来还是比较复杂的,教程把资源的部分已经全部提前完成了,教大家的部分则集中于对这些资源的利用,以及一些关键代码的编写。
最好的一点是,讲解的三位Unity工程师,完全把听众当成了最初级的Unity和编程学习人士,对那些基本但又关键的概念进行重点讲解。这些内容中,有很大一部分和Unity4.6的新动画和UI系统有关。对于新的动画系统,这个教程最打开人眼界的地方是,作为一个状态机系统,它其实可以管理各种事件,比如UI动画的驱动,而并不是只限于角色动画。而动画编辑器,也可以对UI物件的所有参数进行关键帧编辑,这个流程和我最近一年用的After Effects非常类似。
在编程的框架方面,十分重要的一些要点包括,利用public static给一个class产生变量,比如分数这种全局性的,一旦生成后,就可以从这个类直接来调用,而不必去找特定的Instance物体。
在对Player和Enemy的互动,特别是attack造成damage这一块,这个教程的处理方式也很值得学习。
Enemy对Player的Attack,首先在Enemy身上挂这些代码:
void Awake ()
{
player = GameObject.FindGameObjectWithTag ("Player");
playerHealth = player.GetComponent <PlayerHealth> ();
...
}
这样的话,就能通过Player挂的Tag立即找到Player,并且这个Find是在Awake时做的,所以不费。(联想到我代码里那么多Find都在Update里面,简直要汗死)
然后在主循环里面跑一个对Enemy攻击速度的判定来决定Attack是否执行:
void Update ()
{
timer += Time.deltaTime;
if(timer >= timeBetweenAttacks && playerInRange && enemyHealth.currentHealth > 0)
{
Attack ();
}
...
}
如果执行的话,Attack是这么写的,首先,计时器清零,然后真正起作用的是,让Player下面挂的一个函数TakeDamage来执行,这里的关键来了,TakeDamage()是有参数的,TakeDamage (int amount),那么,正好,把EnemyAttack函数里的attackDamage丢进去,伤害造成了:
void Attack ()
{
timer = 0f;
if(playerHealth.currentHealth > 0)
{
playerHealth.TakeDamage (attackDamage);
}
}
我的那个小游戏压根就没用到过函数之间扔参数这么基本的事情,因为我不会用(一万个羊驼在心中冲撞。)但这个太基本了,不会的话,各个系统之间就很难进行消息和参数传递。(所以我的游戏很简单啊啊x100)。
再看Player这边,就没啥好说的了,他所挂的PlayerHealth这个脚本下面有一个函数叫做TakeDamage:
public void TakeDamage (int amount)
{
damaged = true;
currentHealth -= amount;
...
}
这个教程让我想起来最近用的Max7这个软件,它里面每个build-in的patch,或是网上下的其他人开发的external的patch,都有一个help文件,这个文件基本上包含了该patch的详细用例,而且最妙的是,用的也是max patch的形式,所以可以拷贝任何部分到自己的工程中直接去用。用老师的话来说,就是要当黑客,善于这里偷一点,那里改一点,来做东西。不过他也强调,能这么干的前提是,你至少要看懂别人写的是什么,否则连拷贝什么部分都是瞎摸,出问题也不知道怎么解决。也许将来游戏引擎也能做到这样,想要个什么功能,拖进来就能用,不会用还能立马给你一个能跑起来的小demo。不过想想也比较难,游戏跟这类纯艺术或是音乐作为产出的软件还是有本质不同,它的逻辑和资源是分开的。。所以无论如何,都没法像Max7这样,甭管再复杂的patch,老纸也能给你一页显示全了。
游戏引擎里,Unity算是门槛比较低的,但必须要会编程这一点着实要人老命。但是,编程为什么会要了老命呢,原因无非是,花的时间不够多呀!学习一个工具就像练一门功夫,Unity在进步,我们也跟着进步,进一寸是一寸。
![]() |
陈灼的最新日记 · · · · · · ( 全部 )
- 契诃夫《在大车上》 ,In The Cart (4人喜欢)
- 2025-2027 重读书单 (18人喜欢)
- 厄休拉·勒古恩在《Steering the Craft》中的推荐阅读 (34人喜欢)
- 2025书单 (12人喜欢)
- 2024年的20本书 (27人喜欢)
热门话题 · · · · · · ( 去话题广场 )
-
加载中...