全书从建立编程脚本和游戏框架为出发点,逐步阐述游戏开发中的核心概念,核心的物理系统和数学基础,然后针对游戏中的界面,动画,特效和音频以及Unity 3D中各个常用模块的使用方法进行讲解,并详细介绍了游戏开发中数据管理和资源管理。
直接通过简单实例介绍,如何通过脚本修改物体位置,处理用户输入和检测碰撞的方法。
unity规定,能够挂在物体上的脚本文件必须是“脚本组件”(另有一种不是组件的脚本文件),脚本组件要继承自MonoBehaviour,且脚本代码中的class名称必须与文件名一致。
对代码要有个基本的认识吧;然后unity的话第一次接触,那就了解一些常用的函数接口,比如这里用的Debug,Input,Translate等,简单几行代码就能实现一个基本的控制移动的效果了。重点提一下,这里的Time.deltaTime 指的是两帧之间时间间隔,这样就可以保证每秒移动的距离在不同帧率的情况下都是一样的了。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveCase:MonoBehaviour
{
//Start is called before the first frame update
void Start()
{
}
//Update is called once per frame
void Update()
{
Debug.Log("Update Time:" + Time.time);
float v = Input.GetAxis("Vertical");
float h = Input.GetAxis("Horizontal");
transform.Translate(h*10f*Time.deltaTime, v*10f*Time.deltaTime,0);
}
}
知道了物体如何移动,下一步就得知道如何判断一个物体是否碰到另一个物体了。实际上,抛开高级游戏引擎提供的各种技术,直接判断物体之间的距离就足以实现碰撞检测,即两个物体之间的距离小于某个值,就是碰到了。现代游戏引擎给出了更统一,更简便的方法——使用触发器。触发器是一个组件,它定义了一个范围,当其他带有碰撞体组件的物体进入这个范围时,就会产生一个触发事件,脚本捕捉到这个事件的时候,就可以做出相应的处理。
产生触发事件的要求,一个是触发器(挂载collider组件,并勾选了 isTrigger),一个是碰撞体组件(挂在了collider组件,没有勾选isTrigger),同时挂载了刚体组件rigidbody,并勾选了 is kinematic;这样碰撞的基础条件就具备了。
using System.Collection;
using System.Collection.Generic;
using UnityEngine;
public class Coin: MonoBehaviour
{
void OnTriggerEnter(Collider other)
{
Debug.Log(other.name);
gameObject.SetActive(false);
}
}
用unity创建的游戏是由一个或多个场景组成的,默认Unity会打开 一个场景。
在游戏开发时,绝大部分操作都是在某一个场景中进行的,因此一开始不用太关心场景之间的关系,只需要关心在一个场景之内发生的事情。实际上,关键的概念只有GameObject(游戏物体),Component(组件)和父子关系3个。
Unity中坐标 X代表右,Y代表上,Z代表前
变换组件(Transform)
Position(位置),XYZ,所有值都是float,单位长度1米,对应多少个像素在游戏里有设置。
Rotation(朝向), 由于“旋转”这个词容易在“旋转的动作”和“已经旋转到的位置”之间混淆,因此在本书中会使用“朝向”一词,以表明它是物体目前具有的状态。
按照三维设计软件的惯例,Unity中朝向也是用三个角度来表示的,分别是绕X轴,y轴和z轴的旋转角度, 这种用3个角度表示朝向或旋转的方法叫欧拉角。
虽然Unity在编辑器面板上使用欧拉角表示朝向,但是在引擎内部是使用四元数表示朝向和旋转的。
为避免未来的讨论产生混淆,先澄清一个基本问题:某个自己编写的脚本是一种组件类(class) ,挂载在物体上的脚本是一个实例化的组件,即一个对象(编程语言中的object)。
利用预制体创建物体,要使用实例化方法Instantiate,创建环形排列的是个物体。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CreateObj:MonoBehaviour
{
public GameObject obj;
void Start()
{
for(int i = 0; i++; i< 10)
{
Vector3 p = new Vector3(Mathf.Cos(i*2*Mathf.PI/10), 0, Mathf.Sin(i*2*Mathf.PI/10));
Instantiate(obj,p,Quaternion.identity);
}
}
}
跟随主角的摄像机
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FollowCamera:MonoBehaviour
{
public GameObject target;
Vector3 dis;
void Start()
{
dis = gameObject.transform.position - target.transform.position;
}
void LateUpdate()
{
gameObject.transform.position = target.transform.position + dis;
}
}
俯视角的设计游戏,玩家从侧上方俯视整个场景。