3

游戏入门

  • 把游戏想象成一个动画片,它是一帧一帧播放的
  • 可以控制它的播放
  • 逻辑是多变的
  • 每帧播放什么,需要靠程序来控制

游戏的要素

游戏的要素: 逻辑显示声音

逻辑

游戏的玩法,控制。

  • 游戏本身逻辑: 游戏的玩法 用户的输入
  • AI: NPC互动 自动寻路 追逐敌人
  • 物理运算: 碰撞检测 重力 惯性 速度等物理计算
显示

展示游戏的内容,过程,逻辑的结果。

  • 动画系统:控制动画的播放
  • 底层渲染:硬件如何完成显示
声音

相对独立

clipboard.png

游戏团队中的角色

策划:设计游戏的玩法
美术:制作游戏需要的美术资源
程序员:编写游戏逻辑,整合一切

游戏引擎的作用:

  • 减少工作量
  • 减少重复开发
  • 降低游戏开发的门槛
Unity具有的模块

AI, 渲染, 物理运算, 声音, 动画系统, 资源管理, 跨平台, 系统架构

Unity工程

下载Unity3D

添加文件内容时最好直接在UnityProject面板里面移动或者删除,如果在磁盘中进行的话,可能会产生一些错误,丢失一些东西。

Project用于显示项目中的文件与资源信息。
Scene用户显示项目中的场景信息,在这个面板中可以对项目场景中的组件进行调整。
Inspector用于显示组件的参数信息,在这个面板汇总可以观察和调整整个组件的参数信息。
Game显示的是项目的静态运行页面。
Hierarchy显示项目中的各种组件。

clipboard.png

Scene和GameObject属性

clipboard.png

第一个手状按钮,用于调整相机,以便从不同的方位观察整个场景
第二个按钮,用于平移组件
第三个按钮,用于旋转组件

Prefabs
  • 重复利用
  • 同时修改

角色控制

场景的搭建

静态组件动态组件

ReBirth
Collider,作为碰撞检测条件,碰撞到了,触发一些事件。Collider需要用户自己编辑
Directional light: 光线
CameraOrthographic,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 ;
}
响应用户的输入
  1. 怎么设置用户输入
    键盘(方向键+W,A,S,D) + 鼠标
  2. 如何在脚本中检测用户输入

游戏输入
Edit -> Project Settings -> Input设置游戏输入
Update中利用Input类来检测输入状态
Input.GetAxis返回的值是-11之间, 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(人体形态的动画)

clipboard.png

动画应用

clipboard.png

在对话框中选择人形的Avatar标识

Controller中选择状态机,状态机的重要三部分:状态,状态转换,参数


alogy
1.3k 声望121 粉丝

// Designer and Developer


« 上一篇
Yahoo优化规则
下一篇 »
Python_基础