Unity3D基础
游戏入门
- 把游戏想象成一个动画片,它是一帧一帧播放的
- 可以控制它的播放
- 逻辑是多变的
- 每帧播放什么,需要靠程序来控制
游戏的要素
游戏的要素: 逻辑
,显示
,声音
逻辑
游戏的玩法,控制。
- 游戏本身逻辑: 游戏的玩法 用户的输入
- AI: NPC互动 自动寻路 追逐敌人
- 物理运算: 碰撞检测 重力 惯性 速度等物理计算
显示
展示游戏的内容,过程,逻辑的结果。
- 动画系统:控制动画的播放
- 底层渲染:硬件如何完成显示
声音
相对独立
游戏团队中的角色
策划:设计游戏的玩法
美术:制作游戏需要的美术资源
程序员:编写游戏逻辑,整合一切
游戏引擎的作用:
- 减少工作量
- 减少重复开发
- 降低游戏开发的门槛
Unity具有的模块
AI
, 渲染
, 物理运算
, 声音
, 动画系统
, 资源管理
, 跨平台
, 系统架构
Unity工程
下载Unity3D
添加文件内容时最好直接在Unity
中Project
面板里面移动或者删除,如果在磁盘中进行的话,可能会产生一些错误,丢失一些东西。
Project
用于显示项目中的文件与资源信息。Scene
用户显示项目中的场景信息,在这个面板中可以对项目场景中的组件进行调整。Inspector
用于显示组件的参数信息,在这个面板汇总可以观察和调整整个组件的参数信息。Game
显示的是项目的静态运行页面。Hierarchy
显示项目中的各种组件。
Scene和GameObject属性
第一个手状按钮,用于调整相机,以便从不同的方位观察整个场景
第二个按钮,用于平移组件
第三个按钮,用于旋转组件
Prefabs
- 重复利用
- 同时修改
角色控制
场景的搭建
静态组件
,动态组件
ReBirth
Collider
,作为碰撞检测条件,碰撞到了,触发一些事件。Collider
需要用户自己编辑Directional light
: 光线Camera
:Orthographic
,Perspective
脚本基础
通过脚本来控制动画。
Unity
里可以使用C#
和UnityScript
在Unity
里面凡是能挂在GameObject
上的都是Component
Script
也是一种Component
Scirpt
要想挂在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
中选择状态机
,状态机的重要三部分:状态,状态转换,参数