终于找到免费科学上网的方法了,虽然 速度一般,但对于学习unity官方视频来说还行。
废话不多的说,这次学习官方案例 Roll a ball,就是控制小球在平台上吃食物,这么一个简单的游戏。对于unity的一些基本操作,我就不在博客中介绍了,所以还请各位朋友先学会unity的基本操作,几乎只需要知道unity的面板有几块,分别操作什么,怎么创建物体,脚本,以及给物体添加组件,就可以学习本博客了。
好,现在开始。先创建一个3D项目,名字就叫做 Roll a ball,
在Assert 目录下创建几个常用文件夹,_Scenes, _Material, _Prefabs, _Scripts。剩下的需要时在添加,这里文件夹名字的下划线是为了保证文件夹较多的情况下这个文件夹会排在顶端。
在场景中新建Plane,重命名为Floor(地板),大小下x、z 扩大为两倍,在新建一个Cube,重命名为Wall(墙),然后都把他们拖进_Prefabs文件夹,这样他们就会自动做成一个Prefab,现在我们就通过这两个东西构建如下场景:
只要类似就行了。但是现在是不是有点要亮瞎我们的XXXXX眼,所以在_Material 文件夹下新建Material,分别给他们填充材质。:
现在是不是好很多了。现在创建角色,新建一个Sphere,重命名为Player,为了要能够控制它移动,给他添加一个Rigidbody组件,把它也做成Prefab,然后把它拖到地板中间。位置刚好在地板上或者高于地板一点都行。
现在,我们在_Scripts目录下新建一个脚本来控制Player的运动,脚本名字为PlayerController,编辑脚本:
using UnityEngine;
using System.Collections;
public class PlayerController : MonoBehaviour {
private Rigidbody playerRig; //用来获取刚体组件
public float moveSpeed = 8; //移动的速度
// Use this for initialization
void Start () {
playerRig = GetComponent<Rigidbody>(); //获取
}
//物理操作一般放在这个方法中
void FixedUpdate ()
{
//当按下水平按键 A D 左方向键 右方向键时,返回一个 -1~1之间的数
float h = Input.GetAxis("Horizontal");
//当按垂直按键 S W 下方向键 上方向键时,返回一个 -1~1之间的数
float v = Input.GetAxis("Vertical");
//添加一个力方向是 new Vector3(...)
playerRig.AddForce(new Vector3(h * moveSpeed, 0, v * moveSpeed));
}
}
现在运行游戏,就可以控制小球运动了。但是画面有点别扭,现在给Main Camera 添加脚本,名为CameraController,编辑如下:
using UnityEngine;
using System.Collections;
public class CameraController : MonoBehaviour {
public GameObject player; //获取小球
private Vector3 offset; //用来计算相机和小球之间的差距
// Use this for initialization
void Start () {
offset = transform.position - player.transform.position; //得到差值
}
//一般相机的移动都放在这个方法
void LateUpdate () {
transform.position = offset + player.transform.position; //保证差值不变
}
}
现在相机就能跟随小球移动了。现在来创建食物。新建一个Cube,重命名为Food,把他做成Prefab,做成如下的样子:
这是要修改的 地方
勾选IsTrigger ,把他作为触发器。
然后给他添加赋上一个Material选择一个颜色,在添加一个名字叫做MyRotate的脚本并编辑:
//当与触发器发生碰撞
void OnTriggerEnter(Collider other)
{
//如果碰撞的物体的Tag是PeckUp
if (other.tag == "PickUp")
{
//销毁物体
Destroy(other.gameObject);
}
}
这是添加在类中的一个方法,添加进去。还要记得选择面板上的Food添加Tag,名字为PickUp,然后点击Inspector面板的Apply让他运用到所有物体。现在运行游戏就能消灭食物了。
最后我们让屏幕能够显示吃到食物的数量,新建一个UI—>Text,放到屏幕上方,在新建一个,放到屏幕中间,用来显示胜利文本,默认是不显示的,如:
修改PlayerController脚本,让他能够修改分数:
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class PlayerController : MonoBehaviour {
private Rigidbody playerRig; //用来获取刚体组件
public float moveSpeed = 8; //移动的速度
public Text textContnt; //得到Text组件
public Text winText; //得到胜利的文本组件
private int score = 0; //记录分数
// Use this for initialization
void Start () {
playerRig = GetComponent<Rigidbody>(); //获取
SetTextConten();
}
//物理操作一般放在这个方法中
void FixedUpdate ()
{
//当按下水平按键 A D 左方向键 右方向键时,返回一个 -1~1之间的数
float h = Input.GetAxis("Horizontal");
//当按垂直按键 S W 下方向键 上方向键时,返回一个 -1~1之间的数
float v = Input.GetAxis("Vertical");
//添加一个力方向是 new Vector3(...)
playerRig.AddForce(new Vector3(h * moveSpeed, 0, v * moveSpeed));
}
//当与触发器发生碰撞
void OnTriggerEnter(Collider other)
{
//如果碰撞的物体的Tag是PeckUp
if (other.tag == "PickUp")
{
score++;
SetTextConten();
//销毁物体
Destroy(other.gameObject);
}
}
//设置文本信息的方法
void SetTextConten ()
{
textContnt.text = "Score :" + score;
if (score == 9) //因为我的食物数量有9个
{
winText.gameObject.SetActive(true);
}
}
}
最后运行结果:
项目工程:http://pan.baidu.com/s/1hszztwo 密码:2md7
本博客用作新手学习讨论,如有不好或错误的地方也请指出来,谢谢。