http://blog.sysuschool.com/u/mygod/index.html
请稍候,载入中。。。
 
请稍候,载入中。。。
2023/12/18 8:52:00
博文:Unity3D实现虚拟校园行_角色和角色脚本

  所谓角色,即游戏中玩家操控的对象,在虚拟校园行中,通过鼠标键盘操控角色行走和视角变化,默认情况下使用第一人称视角,当处于第一人称视角时,视窗中是看不到角色模型自己的,但切换到第三人称视角的话,就需要在视窗中看到角色模型了,操控角色动作时还要有相应的动作,如行走跑步的动作、静立动作等。 

  本篇重点说说角色的选择、模型的状态切换、角色模型和视角控制。 

  讲正题前,先说个小插曲,其实去年年底的时候,场景就搭建完成了,也可以实现以第一人称视角在校园行走游览了,只是没有第三人称视角的切换、没有UI界面,甚至没有退出游戏的功能,要退出只能用windows的组合热键强行退出,这又是怎么一回事呢?这里先吐槽下,unity引擎不像别的应用软件,高版本一般兼容低版本,不是的,unity各个版本是不兼容的,当使用其他版本打开项目时,首先需要转换,转换时会出现兼容警告,尤其使用了一些版本资源时更为麻烦,直接导致不能运行!当时,使用unity早期版本4.3版,大概时2014年左右的版本,这个版本内置了一个资源包,包含了第一和第三人称的角色模型和操控,无需写一行代码,只要将其拖入你的场景中即可,其中第三人称的模型是一个拿着扳手的工人模型,操控时可以跑跳,但对于怎样制作UI界面、是否可以更换模型还一无所知,后来换了一个新版2021版,这个资源包就不能用了。 

  如果只采用第一人称视角,这时视窗是看不到模型自己的,完全可以不用任何角色模型和动作,一个unity空对象加一个胶囊组件,组件调整到人物的高度和宽度即可模拟碰撞,将摄像机调整到模型头部位置,视窗效果如同人物站立的视角,然后跟随角色就好了。但如果需要第三人称视角,就不同了,不仅能看到角色的模型,还需要有动作(动画),还有一点,因为摄像机与角色有一定的距离和角度,当行走到某些场景位置时会发生环境的模型挡住摄像机的问题,这里还要设置摄像机的避障,让相机自动调整与角色的距离绕开障碍物。 

1、角色模型的选择 

  这里的模型因为有动画的要求,故必须是一个有骨骼绑定的模型,这个需要在3dsmaxmaya之类的软件中完成,角色的建模不是一个简单的事,这里选用了unity官方提供的一个机器人模型,官方模型比较标准,在套用动画的时候一般没有问题,补充一下,就算自己建模,动画是可以分开制作,利用unitymacanim动画系统,模型可以套用其他模型的动画。 

2、模型的状态切换 

  先不谈如何鼠标键盘操控模型,先看看如何控制模型跑步或站立的状态? 

  导入有骨骼绑定的角色模型,一定要设置动画类型animation typehumanord人形动画,接下来的需要使用unitymacanime动画系统,有些复杂,这里简单介绍一下,首先角色模型需要一个animator组件,组件中需要一个骨骼配置avatar,这个导入时选了人形动画会自动生产,还需要一个状态机(动画控制器),在状态机中将idle站立动画和跑步动画拖入成为模型的两个状态,然后在两个状态间建立过渡,设置过渡的条件(状态机中可设置参数,略过),即从站立到跑步,什么情况下去切换,反之亦然,最后在脚本中去控制参数,从而控制模型在什么情况下跑步,什么情况下站立,这里说明下的站立动画,当然不跑步时,也可以不动作完全静止,但最好是有一些抬抬手臂、转动身体之类动作会更好。还要补充一点,类似跑步行走站立等动作,可以使用其他模型的,一般包含在模型中,导入这些含动作的模型,借用其动作就可以,注意前提是都必须是人形动画。 

  如下脚本中的两行代码(这两行代码不是出现在一个地方),第一行代码,获取到模型的动画组件anim,第二行代码是设置参数状态(参数直接控制状态的切换)

anim = robot.GetComponent<Animator>();

anim.SetBool("isRun", true);  // 状态机切换

 

3、角色模型和视角控制

 

  为了控制视角,场景中的角色并非一个单模型,而是一个组合,层次结构是这样的

Player

  - Robot kyle

  - H

- - V

- - - main camera

  这里player是一个空对象,robot模型和空对象Hplayer子对象,空对象vh子对象,main camerav 的子对象,(科普:层次关系,父动子动,子动父不动,即父带动子,子在父下可自动),这样做的好处是,鼠标左右移动控制h,带动摄像机水平旋转(视角左右变化),鼠标上下控制v,带动摄像机上下变化视角,而避障直接动摄像机与player的距离。

 

  角色的移动控制,这里采用了一个组件character control角色控制,比较容易处理移动,该组件提供了一个move方法,且可以设置移动的坡度、台阶的高度等。(当然也可以使用刚体组件,脚本写起来更复杂)。

 

  具体代码参看源脚本,这里说说脚本和场景模型的关系,貌似新手一开始都晕,特别刚开始按教程学写脚本,最后不明白脚本怎么运行的?

 

  这里补充一些个人见解,首先你的场景是由一堆游戏对象组成的,在hierarchy层次面板上的对象,只要一运行,这些对象上挂的组件就开始运行了,这些组件包括脚本,其实组件就是写好了的脚本(这样说有点问题,为了便于理解),具体说脚本,比如一个脚本挂在player身上,如果player一开始就在场景中(也可以制作预制件,在一定条件下克隆出来),只要游戏运行,脚本就开始执行了,你的脚本中写在awakestart方法中的代码,模型加载时运行,写在update方法中的代码,游戏运行时每帧执行一次。还有,如果另外一个物体上的脚本需要调用如player身上的脚本,需要在其脚本上获取player的脚本组件。基本上是这么一个道理,如果要控制另外一个对象的参数,也是如此,需要获取那个对象的那个组件,才能控制其组件的参数。

 

  这里player挂了三个脚本,一个控制player的移动及状态切换(跑步和站立)player.cs,一个控制视角变化cameractrl.cs,一个控制隐藏显示鼠标光标cursorlovkhide.cs

mygod | 阅读全文 | 回复(0) | 引用通告 | 编辑
发表评论:
请稍候,载入中。。。
公告
请稍候,载入中。。。
时间记忆
请稍候,载入中。。。
最新日志
请稍候,载入中。。。
最新评论
请稍候,载入中。。。
最新回复
请稍候,载入中。。。
我的好友
我的相册
站点信息
请稍候,载入中。。。
生活因感动而精彩,理想在创造中放飞
Powered by Oblog.