撰写了文章 更新于 2018-02-27 23:07:24
Unity3D初级教程之第三人称视觉控制(上)
首先这文主要对应完全不会和并没真的想做出游戏的人士,不难,但脚本是要碰的,最终的目的就是按上下左右/WSAD 3D角色会走。
其实我个人对unity的评价是……shity,那为什么要用?因为如图有很多免费asset
unreal也有这种商店,最近去看过是没什么免费的。
那……我也只好先继续用unity了,反正也只是玩玩而已嘛。
如果做2D游戏,那么个人觉得可以换引擎了,不用在开头看到unity的商标多好,如果只是玩玩的话当然是选个用着更舒服的了,2D引擎有很多,
还见过有仿unity的但是只能制作2D游戏的引擎,虽然没试过但推荐的人说“开始也没想到,用过才知道好”。更新:找到了是Duality。
先从下载开始,必须下standard assets,最好把文档下了。编辑脚本用文本编辑器就行了,但是附带的2种(最新版只能用微软的了)有输入提示还是比较好的,就是打开比较慢,还会因错误自动关闭,这不是只是稍微不同的文本编辑器而已吗?反正不太懂了,体验不太好就是真的。
打开软件,为什么说它shit呢?这个配色就很难看,虽然也有办法改,算了。总之这里打开的意思就是已经建了个3D的工程,然后……能到打开这步就应该已经建好账号了吧?那可以直接上asset store下载,可以在浏览器上,也可以软件里,试试找找那个窗口在哪?
把想要用的人物模型下了,再下些动画,然后加到assets里,这样就准备好了。
接着在Hierarchy上建一个plane,到这里为止的步骤可以参考https://www.jianshu.com/p/6e4b0435e30e
再接下来教程是加个球,这里则要加assets里的人物模型,反正就从assets里拖进去Hierarchy或者Scene就行了,如果位置不对比如陷进去了就改Inspector里Transform下Position。
之后终于到控制移动,要控制角色有2种方法,一种是用/Documentation/en/Manual/class-CharacterController,在Inspector里点Add Component选CharacterController,如果觉得难找,注意有个搜索栏。
这会用一个胶囊药丸形状围着角色作为“实体”,就是说其实就是一个药丸在移动。
需要手动调一下到合适大小,感觉对不准?我也这么觉得,一定是Unity的问题,对齐基本靠运行时看脚和地面,不知有无更好的办法。
加上以后角色并不能动,因为并没有这么便利,Unity可能觉得虽然我们菜得选用CharacterController,但是还是不能决定我们想用什么操作方式,于是,自己写脚本啊,点Add Component选New Script,这里可以继续参考上面的教程,那内容……没关系,有官方的例子
/Documentation/en/ScriptReference/CharacterController.Move
这是官方文档里的,网上版路径应该也是一样,直接复制粘贴就可,不过注意
public class 名字
要和之前New Script起的名字一样,比如起了叫controlcharactermovement那
using UnityEngine; using System.Collections;
public class controlcharactermovement : MonoBehaviour {
public float speed = 6.0F;
public float jumpSpeed = 8.0F;
public float gravity = 20.0F;
private Vector3 moveDirection = Vector3.zero;
void Update() {
CharacterController controller = GetComponent<CharacterController>();
if (controller.isGrounded) {
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
if (Input.GetButton("Jump"))
moveDirection.y = jumpSpeed;
}
moveDirection.y -= gravity * Time.deltaTime;
controller.Move(moveDirection * Time.deltaTime);
}
}
这个例子能移动,但是面向方向不变,其实只要改掉一句就能换成朝按键指示方向移动,不过继续前还是得讲讲脚本,就当上面的教程里的七已经看懂了,补充来说,start是游戏一开始会运行(暂且这样认为),只运行一次。之后每帧都运行update,Fixedupdate也是每帧运行,但是和物理同步,因为这是CharacterController,没有物理的事,所以用update。
可以看到之前上面教程里public出speed,就在script下多出一个speed项(可能需要先运行一次),可以修改了,这里则有3个变量。又据说不推荐这种做法,想在Inspector这里修改的话有别的做法,而public出来的东西任何脚本都可以修改,一旦复杂了出了问题,很难找出来。但是另一种方法的那个词很长,还要中括号。反正暂时很简单,就先public吧,这点在做简单的镜头对准角色时,也可以用来选择角色的物体。
看看update下面,先把这个物体下的CharacterController项放进新建的一个叫Controller的CharacterController里,反正我就是这样认为的,固定写法,反正和给变量赋值也差不多吧,至于有什么不同不深究。
下面看词义是如果在地面上,这是在CharacterController的Properties里的,那Properties里其他的也是差不多的写法,这个……详细可以看文档的例子(如果有),我也没深究。
下面把输入得到的数据放入新建的Vector的moveDirection。
下面这句大概就是把自己的面向坐标按输入取得的值移动后的坐标,比如按上就会向物体的前面移动,然后转成世界的坐标,为什么呢?世界的坐标就是类似东南西北,自己的坐标类似自己的前后左右,自己向前移动了,那相对世界也许是向西移动,而最终移动需要按东南西北算,差不多是这种感觉。但是这里我们想要一个按上下左右直接就是世界北南西东的控制,就是这句是不需要的,直接去掉的话还是能移动的,那只需要要把这句换成改变面向方向的就行了,比如/Documentation/en/ScriptReference/Transform-rotation
加上/Documentation/en/ScriptReference/Quaternion.LookRotation
再加上一点点理解后可以这样写
Quaternion target = Quaternion.LookRotation (moveDirection);
transform.rotation = Quaternion.Lerp (transform.rotation, target, 0.3f);
再下面的不用改动就可以正常的移动了,但是并没有在走路,这就需要动画,其实……也不是很难,可以看文档,是/Documentation/en/ScriptReference/Animation?不,是/Documentation/en/ScriptReference/Animator,Animation已经被unity抛弃,虽然没经历过不知道详细。这个主要是图形界面那边设置,脚本成分比较少,如果运气好下载的模型就自带animator可以参考。因为以我的标准来说已经写得太长,感觉这个方面要截很多图,还要unity似乎想把Animator也抛弃掉,搞出个simpleAnimation,所以留白,也许以后补充个别人写得够简单容易看的教程。还是自己来吧。
unity里的动画分成好几种,为了方便暂且认为是humanoid的和不是humanoid的,模型自然也分humanoid和不是humanoid的,为了方便这里只用humanoid的,如果真的有人幸或者不幸进来了,跟着到这一步不幸无法继续下去……那你应该知道应该怪啥了。
先在Project窗口的Assets里新建一个Animator Controller,然后在Hierarchy或者Scene里选择模型的物体,在它的Inspector里新加Animator。
Controller选刚才新建的Animator Controller,Avatar选模型自带的Avatar,如果没有,那在Assets里找到原始的模型,在Inspector里
如图在Rig的Animation Type选Humanoid,对了这个有没有Avatar都要这样设置,然后自动生成一个,印象中这种情况试过2个都可以。那要是不行呢?干嘛问我,你应该知道应该怪啥的。
回到模型物体,点击它然后到Animator窗口,如果还没弄出来这个窗口可以参考第三张图。里面还没任何动画,以下图里的动画为例。
可以在Assets里直接拖动画文件进去,橙色就是默认一开始播的动画,可以通过右键设置。
然后点运行,应该已经能动了,如果只动了一下就不动,那在Assets里找到动画文件,Inspector里Loop Time勾上就会一直循环播放。
为了简单移动,设定只有移动和不动两种动画,那要怎么让它不动呢?脚本。
在Animator窗口里……算了,看图
起名随意,比如ismoving,然后回到Layers,找一个叫idle之类的动画拖进去作为不移动时的动画,对的,不移动也是需要动画的,我这里这个模型是自带一个,如果没有呢?那拖个别的动画当它是吧,这里主要是实现效果嘛。把有idle动画的state右键设置为默认,然后右键make transition把两个state互相连接。
然后在它们的Inspector里Transitions项下Conditions里设刚才加的参数作为条件,一个true,一个false。Has Exit Time是即使满足条件也要等当时动画播完再换别的动画,所以勾要去掉。

参考Documentation/en/ScriptReference/Animator.SetBool,我不会写全,漏了的部分自己补吧。
if (moveDirection.sqrMagnitude > 0.04f) {
Quaternion target = Quaternion.LookRotation (moveDirection);
transform.rotation = Quaternion.Lerp (transform.rotation, target, 0.1f);
m_Animator.SetBool("ismoving", true);
}else{
m_Animator.SetBool("ismoving", false);
}到这里应该就是成功了,如果没有肯定不是我的问题了,因为我也跟着做了一遍了,很肯定没错。
假设把剩下的动画部分完成后,可以控制移动,还可以跳,那是不是就可以做3D平台游戏了?其实我也这样想过,但是跳也需要动画,比较简单的话比如能推动物体那也需要动画,攻击也需要动画,而且判定猜要用个立方之类,也还没试过,敌人自然也需要动画,至少移动和攻击。

asset商店的一个asset($)例图
不过在那之前何不自己先四处移动试试?到这里也是时候休息一下了,场景是很空旷,可以多做些立方之类出来,试试在非纯平地的感觉,或者用一些能方便做场景的asset或unity自带的做场景(哦那个我也不会就是了)。

试想想,如果就停留在这里,而不继续向shit里深入何不也是一种人生的选择?作为教程感觉到这里也算比较完整了,接下来比起unity我还是先思考人生算了。
最后说说关于shity,那是我个人的观点,你可以觉得它是unity用着,也可以觉得它是shity用着,这都是各人的自由,有什么好争呢?不过2D我确实碰都没碰,只是比如界面,还不是一样是这样的界面吗?所以我个人觉得不可能好,至于是否需要把它作为2D最后的选择,我只能说不确定,不过我会这样建议。
OwenTsai 1年前
wsedr [作者] 1年前
OwenTsai 1年前
wsedr [作者] 1年前
wsedr [作者] 1年前
发布
亚恒 1年前
wsedr [作者] 1年前
发布
亚恒 1年前
wsedr [作者] 1年前
亚恒 1年前
wsedr [作者] 1年前
wsedr [作者] 1年前
亚恒 1年前
OwenTsai 1年前
OwenTsai 1年前
wsedr [作者] 1年前
亚恒 1年前
wsedr [作者] 1年前
亚恒 1年前
wsedr [作者] 1年前
OwenTsai 1年前
wsedr [作者] 1年前
OwenTsai 1年前
第二句话没有问题,祝好。
wsedr [作者] 1年前
发布
wsedr [作者] 1年前
none 1年前
但是拼法是shitty
wsedr [作者] 1年前
发布