unity官方demo学习:Roll-a-Ball

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

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


步骤

1 简介

unity官方demo学习:Roll-a-Ball_第1张图片

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


2 搭建游戏基本场景

unity官方demo学习:Roll-a-Ball_第2张图片

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

3 添加小球移动控制

unity官方demo学习:Roll-a-Ball_第3张图片
  • 给小球物体添加刚体组件
  • 编写脚本,注意Update和FixedUpdate区别,绑定虚拟轴,挂到小球物体上,注意调整速度(其中,addforce的写法可以更简单一些)

4 设置摄像机跟踪

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

5 建立完整的游戏桌面


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

6 创建采集物品

unity官方demo学习:Roll-a-Ball_第5张图片
  • 创建一个立方体,旋转到斜立于桌面上
  • 编写脚本挂到立方体上,控制立方体的旋转
  • 将立方体存为预设体
  • 调整到俯视视角,在场景中复制若干个立方体,作为采集物品,建立空物体结点作为母结点
  • 创建材质,并未所有的立方体统一赋材质

7 建立小球采集物品逻辑

unity官方demo学习:Roll-a-Ball_第6张图片
  • 在小球的控制脚本中添加碰撞检测逻辑,如果与采集物品碰撞,就让采集物品消失
  • 将采集物品预设体的设置为isTrigger(分清静态和动态碰撞物体,分清刚体和网格碰撞体的区别)
  • 给采集物体添加刚体,取消勾选isTrigger,再尝试碰撞情况
  • 将采集物体的is kinematic勾上,再尝试

8 添加游戏GUI

unity官方demo学习:Roll-a-Ball_第7张图片
  • 在场景目录上添加UI控件,自动出现Canvas母结点和Text控件结点
  • 在小球的控制脚本中添加代码,关联游戏计分的字符label和最终游戏赢的字符label,注意关联场景中的控件到脚本的公共变量中。

9 编译工程成可执行游戏

unity官方demo学习:Roll-a-Ball_第8张图片
  • 设置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文件,离线可运行

你可能感兴趣的:(unity)