【官网地址】http://unity3d.com/learn/tutorials/projects/roll-a-ball

以下所有素材和代码来自官网。


步骤

1 简介

unity 弹球_System

整个例子的目的是做一个小球拾取桌面上立方体的小游戏,综合运用到了入门所需的知识,包括编辑器的使用、建模、脚本编写、材质、预设体、刚体、碰撞检测、摄像机、UI以及编译等,方便新手快速了解unity3d游戏的制作流程。


2 搭建游戏基本场景

unity 弹球_unity_02

  • 建立Scene , Scripts , Material 文件夹
  • 场景中添加桌面、小球、灯光(勾选阴影)
  • 给桌面和小球附上材质

3 添加小球移动控制




unity 弹球_unity_03



  • 给小球物体添加刚体组件
  • 编写脚本,注意Update和FixedUpdate区别,绑定虚拟轴,挂到小球物体上,注意调整速度(其中,addforce的写法可以更简单一些)


4 设置摄像机跟踪



unity 弹球_System_04



  • 重置摄像机的位置参数,和观察角度。
  • 尝试将摄像机挂到小球的子节点上,发现不行,这样,小球翻滚会导致摄像机视角翻滚。
  • 编写脚本,注意LateUpdate函数,计算摄像机到小球的相对距离向量的偏移量,然后在小球移动的过程中使得摄像机的位置加上这个偏移量,实现摄像机跟随。


5 建立完整的游戏桌面



unity 弹球_unity 弹球_05



  • 用建模工具简单构建桌子的四个围边,建立一个空物体结点作为母结点便于管理
  • 巧妙运用duplicate命令以及旋转、平移


6 创建采集物品



unity 弹球_控件_06



  • 创建一个立方体,旋转到斜立于桌面上
  • 编写脚本挂到立方体上,控制立方体的旋转
  • 将立方体存为预设体
  • 调整到俯视视角,在场景中复制若干个立方体,作为采集物品,建立空物体结点作为母结点
  • 创建材质,并未所有的立方体统一赋材质


7 建立小球采集物品逻辑



unity 弹球_控件_07



  • 在小球的控制脚本中添加碰撞检测逻辑,如果与采集物品碰撞,就让采集物品消失
  • 将采集物品预设体的设置为isTrigger(分清静态和动态碰撞物体,分清刚体和网格碰撞体的区别)
  • 给采集物体添加刚体,取消勾选isTrigger,再尝试碰撞情况
  • 将采集物体的is kinematic勾上,再尝试


8 添加游戏GUI



unity 弹球_unity_08



  • 在场景目录上添加UI控件,自动出现Canvas母结点和Text控件结点
  • 在小球的控制脚本中添加代码,关联游戏计分的字符label和最终游戏赢的字符label,注意关联场景中的控件到脚本的公共变量中。


9 编译工程成可执行游戏



unity 弹球_unity 弹球_09



  • 设置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加一个游戏内容文件夹



unity 弹球_unity_10



web版可执行文件,主html加一个unity3d的文件和几个js文件,离线可运行



unity 弹球_System_11