Unity3D基础
游戏入门
- 把游戏想象成一个动画片,它是一帧一帧播放的
- 可以控制它的播放
- 逻辑是多变的
- 每帧播放什么,需要靠程序来控制
游戏的要素
游戏的要素: 逻辑,显示,声音
逻辑
游戏的玩法,控制。
- 游戏本身逻辑: 游戏的玩法 用户的输入
- AI: NPC互动 自动寻路 追逐敌人
- 物理运算: 碰撞检测 重力 惯性 速度等物理计算
显示
展示游戏的内容,过程,逻辑的结果。
- 动画系统:控制动画的播放
- 底层渲染:硬件如何完成显示
声音
相对独立

游戏团队中的角色
策划:设计游戏的玩法
美术:制作游戏需要的美术资源
程序员:编写游戏逻辑,整合一切
游戏引擎的作用:
- 减少工作量
- 减少重复开发
- 降低游戏开发的门槛
Unity具有的模块
AI, 渲染, 物理运算, 声音, 动画系统, 资源管理, 跨平台, 系统架构
Unity工程
下载Unity3D
添加文件内容时最好直接在Unity中Project面板里面移动或者删除,如果在磁盘中进行的话,可能会产生一些错误,丢失一些东西。
Project用于显示项目中的文件与资源信息。Scene用户显示项目中的场景信息,在这个面板中可以对项目场景中的组件进行调整。Inspector用于显示组件的参数信息,在这个面板汇总可以观察和调整整个组件的参数信息。Game显示的是项目的静态运行页面。Hierarchy显示项目中的各种组件。

Scene和GameObject属性

第一个手状按钮,用于调整相机,以便从不同的方位观察整个场景
第二个按钮,用于平移组件
第三个按钮,用于旋转组件
Prefabs
- 重复利用
- 同时修改
角色控制
场景的搭建
静态组件,动态组件
ReBirthCollider,作为碰撞检测条件,碰撞到了,触发一些事件。Collider需要用户自己编辑Directional light: 光线Camera:Orthographic,Perspective
脚本基础
通过脚本来控制动画。
Unity里可以使用C#和UnityScript
在Unity里面凡是能挂在GameObject上的都是ComponentScript也是一种ComponentScirpt要想挂在GameObject上就必须继承MonoBehaviour
通过MonoBehaviour来提供方法来驱动游戏
Instantiate()来创建GameObject- 通过
Awake()和Start()来做初始化 Update,LateUpdate和FixedUpdate更新逻辑- 用
OnGUI绘制UI OnCollisonEnter等进行物理计算OnPreCall等来控制渲染
如何更新逻辑
- 场景启动时调用所有脚本
Awake() - 调用所有脚本的
Start() - 在每一帧会调用
Update() - 所有脚本调用完之后,会调用
LateUpdate() - 然后再某帧中调用
FixedUpdate()// 与时间相关 - 调用
Destory销毁GameObject - 销毁对象时调用
OnDestory来进行析构
脚本间的通信
- 通过
GetComponent来找到其它脚本 - 通过
GameObject.Find来找到其它物体
物体运动
void WalkForward() {
transform.position = transform.position + walkSpeed * transform.forward * Time.deltaTime ;
}响应用户的输入
- 怎么设置用户输入
键盘(方向键+W,A,S,D) + 鼠标 - 如何在脚本中检测用户输入
游戏输入
在Edit -> Project Settings -> Input设置游戏输入
在Update中利用Input类来检测输入状态Input.GetAxis返回的值是-1到1之间, 0表示没有输入
键盘控制:
// Update is called once per frame
void Update ()
{
// Debug.Log ("Horizontal value: " + Input.GetAxis ("Horizontal"));
Vector3 direction = Input.GetAxis ("Horizontal") * transform.right +
Input.GetAxis ("Vertical") * transform.forward;
movement.movementDirection = direction.normalized;
// GetComponent<Rigidbody> ().AddForce (direction.normalized * walkSpeed, ForceMode.Acceleration);
// transform.position = transform.position +
// walkSpeed * direction * Time.deltaTime ;
if (bWalking) {
bWalking = Walking ();
} else {
}
}鼠标控制:
void Update () {
// _clickListener.Update();
if (Input.GetMouseButtonUp (0)) {
ClickOn( Input.mousePosition );
}
}
void ClickOn(Vector2 pos)
{
if (player == null)
return;
Ray ray = this.GetComponent<Camera>().ScreenPointToRay(pos);
RaycastHit[] hits = Physics.RaycastAll(ray);
foreach (RaycastHit hit in hits){
BoxCollider bc = hit.collider as BoxCollider;
if (bc != null && bc.name.Contains("floor") && player != null){
// player.GetComponent<Player>().WalkTo(hit.point);
break;
}
}
}动画导入
Unity中有两套动画类型:
- Legacy // 不推荐使用
- Mecanim:Generic, Humanoid(人体形态的动画)

动画应用

在对话框中选择人形的Avatar标识
在Controller中选择状态机,状态机的重要三部分:状态,状态转换,参数