【官网地址】http://unity3d.com/learn/tutorials/projects/roll-a-ball
以下所有素材和代码来自官网。
步骤
1 简介
整个例子的目的是做一个小球拾取桌面上立方体的小游戏,综合运用到了入门所需的知识,包括编辑器的使用、建模、脚本编写、材质、预设体、刚体、碰撞检测、摄像机、UI以及编译等,方便新手快速了解unity3d游戏的制作流程。
2 搭建游戏基本场景
- 建立Scene , Scripts , Material 文件夹
- 场景中添加桌面、小球、灯光(勾选阴影)
- 给桌面和小球附上材质
3 添加小球移动控制
- 给小球物体添加刚体组件
- 编写脚本,注意Update和FixedUpdate区别,绑定虚拟轴,挂到小球物体上,注意调整速度(其中,addforce的写法可以更简单一些)
4 设置摄像机跟踪
- 重置摄像机的位置参数,和观察角度。
- 尝试将摄像机挂到小球的子节点上,发现不行,这样,小球翻滚会导致摄像机视角翻滚。
- 编写脚本,注意LateUpdate函数,计算摄像机到小球的相对距离向量的偏移量,然后在小球移动的过程中使得摄像机的位置加上这个偏移量,实现摄像机跟随。
5 建立完整的游戏桌面
- 用建模工具简单构建桌子的四个围边,建立一个空物体结点作为母结点便于管理
- 巧妙运用duplicate命令以及旋转、平移
6 创建采集物品
- 创建一个立方体,旋转到斜立于桌面上
- 编写脚本挂到立方体上,控制立方体的旋转
- 将立方体存为预设体
- 调整到俯视视角,在场景中复制若干个立方体,作为采集物品,建立空物体结点作为母结点
- 创建材质,并未所有的立方体统一赋材质
7 建立小球采集物品逻辑
- 在小球的控制脚本中添加碰撞检测逻辑,如果与采集物品碰撞,就让采集物品消失
- 将采集物品预设体的设置为isTrigger(分清静态和动态碰撞物体,分清刚体和网格碰撞体的区别)
- 给采集物体添加刚体,取消勾选isTrigger,再尝试碰撞情况
- 将采集物体的is kinematic勾上,再尝试
8 添加游戏GUI
- 在场景目录上添加UI控件,自动出现Canvas母结点和Text控件结点
- 在小球的控制脚本中添加代码,关联游戏计分的字符label和最终游戏赢的字符label,注意关联场景中的控件到脚本的公共变量中。
9 编译工程成可执行游戏
- 设置build选项
- 编译为PC可执行文件
- 启动游戏测试
项目源码和生成目录
代码
CameraController.cs
using UnityEngine;
using System.Collections;
public class CameraController : MonoBehaviour
{
public GameObject player;
private Vector3 offset;
// Use this for initialization
void Start ()
{
offset = transform.position;
}
// Update is called once per frame
void Update ()
{
transform.position = player.transform.position + offset;
}
}
PlayerController.cs
using UnityEngine;
using System.Collections;
public class PlayerController : MonoBehaviour
{
public float speed;
public GUIText countText;
public GUIText winText;
private int count;
void Start()
{
count = 0;
SetCountText ();
}
void FixedUpdate()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);
rigidbody.AddForce (movement * speed * Time.deltaTime);
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "PickUp")
{
other.gameObject.SetActive(false);
count = count+1;
SetCountText();
}
}
void SetCountText()
{
countText.text = "Count: " + count.ToString ();
if (count >= 12)
{
winText.text = "YOU WIN!";
}
}
}
Rotator.cs
using UnityEngine;
using System.Collections;
public class Rotator : MonoBehaviour
{
// Update is called once per frame
void Update ()
{
transform.Rotate (new Vector3 (15, 30, 45) * Time.deltaTime);
}
}
生成文件
win32可执行文件
一个exe加一个游戏内容文件夹
web版可执行文件,主html加一个unity3d的文件和几个js文件,离线可运行