Unity3D入门(rolling ball)——学习笔记

下载安装

  • 这里是官方下载器,若此种方法不成功,可在这里分类下载各个组件。
  • 安装完成后,打开Unity,可以帐号登陆或者选择work offline,接着创建项目。
  • 项目选择3D,导入的资源也可选择为None。

视图简介

  • Scene:每个游戏都有若干个场景构成,此处可以进行游戏对象的排版和预览。
  • Hierarchy:所有的游戏对象都会在此列出。
  • Project:游戏用到的资源文件,如贴图、脚本文件等等。
  • Inspector:在以上三个窗口中选中任一单位,其详细属性都会显示在Inspector中,可以在此对其进行编辑。
  • Game:运行游戏后可在此看到实际效果。

游戏对象创建(Main Camera和Directional Light 已自动创建)

  • 主角球体:

在Hierarchy中点击Create(不要选中列表中任意对象,否则是创建该对象的子对象),创建3Dproject中的sphere。
重命名为player,在Inspector中Transform一栏,Position设置位置,Scale设置大小,Rotation设置旋转角度。
Player分别设置为:Position:X=0,Y=0.5,Z=0,Scale均为1,Rotation均为0。

  • 地板:

类似的创建plane对象作为地板。
重命名为ground,Position与Rotation均设置为0,Scale设置为:X=2,Y=1,Z=2。此时可以在Scene看到,球体刚好与地面接触。
可以创建材质为对象染色。在Project窗口中,Asserts文件夹下右键Create一个Materail文件,命名为ground。选中这个文件,在Inspector中Albedo右侧的方框中选择一种颜色。完成之后在Project窗口中将ground文件拖拽到Hierarchy里的ground上或者直接拖拽到Scene中的地板上,可发现对象就有了颜色。

  • 四周的墙:

创建4个Cube对象并对其拉伸至长方体作为四周的墙。
分别调整他们的position与Scale,组成一个封闭的四周。并同样用ground材质进行染色。

  • 碰撞消失的“食物”:

用小正方体表示。先创建一个cube,命名为food。因为会有多个同样的food,所以这里使用预设(可被重复使用的游戏对象,相当于克隆对象)。
在project中新建Prefabs,重命名为food,再把刚刚新建的那个cube,从Hierarchy中拖到预设文件food上,它左边的白色正方体变成了蓝色,表示预设已经填充。
现在可以拉动project中的Prefabs于Scene中,发现产生了一模一样的food。

小球移动逻辑实现

  • 添加刚体组件:

刚体组件可以让小球像现实中的球一般有基本的物理特性。
选中小球player,在Inspector最下方有Add Component按钮,选择physics中的Rigidbody添加。

  • 创建编写脚本:

project中新建C#脚本,重命名为Move,打开进行编辑。
使用GameObject.Find()可以找到我们的player对象并与之绑定。
调用player.GetComponent<Rigidbody>().AddForce (0, 0, -10);表示调用刚体组件中的添加力的方法,大小为10,方向为-Z。
Input.GetKey (KeyCode.A){}方法表示长按A键的时候触发事件。
上述代码添加在FixedUpdate(){}函数中,表示可以在多帧中运用力。
using UnityEngine;
using System.Collections;

public class Move : MonoBehaviour {
	GameObject player;//新建一个object类型用来存放获取的对象
	// Use this for initialization
	void Start () {
		player = GameObject.Find ("player");//找到player对象,并与之绑定
	}
	
	// Update is called once per frame
	void Update () {
		
	}

	//FixedUpdate可以在多祯中运用力
	void FixedUpdate(){
		if (Input.GetKey (KeyCode.A)) {//如果长按A
			player.GetComponent<Rigidbody>().AddForce (-10, 0, 0);//在-x方向上添加大小为10的力
		}
		if (Input.GetKey (KeyCode.D)) {
			player.GetComponent<Rigidbody>().AddForce (10, 0, 0);
		}
		if (Input.GetKey (KeyCode.W)) {
			player.GetComponent<Rigidbody>().AddForce (0, 0, 10);
		}
		if (Input.GetKey (KeyCode.S)) {
			player.GetComponent<Rigidbody>().AddForce (0, 0, -10);
		}
	}
}
最后在Unity中将此c#脚本拖拽到player对象上进行绑定,表示当游戏载入player对象时即脚本生效。
选中Main Camera还可在Scene中为其调整视角,可以在Game窗口中进行预览。最后运行可以看到控制小球移动的功能已经实现。

摄像机跟随小球

思路:让摄像机与小球的相对位置保持不变。(不可以直接将摄像机放在小球的子对象中,不然画面会旋转,因为小球在滚动而不是平移)
创建c#脚本,命名为follow。有一个public 的Transform变量。在Unity中将脚本与Main Camera绑定后,Inspector里的follow栏里有一个playerTransform变量,把player对象从Hierarchy中拖进去进行赋值。表示保存的是player的transform,即可获取player的位置。
using UnityEngine;
using System.Collections;

public class follow : MonoBehaviour {
	public Transform playerTransform;
	private Vector3 distance;
	// Use this for initialization
	void Start () {
		distance = transform.position -playerTransform.position;//因为绑定在相机上,可以直接用transform.position 表示相机位置
	}
	
	// Update is called once per frame
	void Update () {
		transform.position = playerTransform.position+distance;
	}
}

触发检测及分数显示

不用碰撞检测是因为碰撞后即使对象马上消失,还是对player有一个作用力。而触发检测则不会对player有影响。
使用OnTriggerEnter(){}方法,表示开始触发时就会触发。
在Inspector中为每个food添加相同的Tag,我添加的为自定义Tag  :  pickUp。每个food在Inspector的box collider中勾选is Trigger。
在Hierarchy创建UI中的Text用于显示分数。在Scene的2d显示模式下把text对象拉到白色框内则表示在画面之内。需要通过using UnityEngine.UI;导入相应类库。把text拉到公共变量showScore上。
直接在Move.cs中添加代码即可。最后该文件代码为:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;


public class Move : MonoBehaviour {
<span style="white-space:pre">	</span>GameObject player;//新建一个object类型用来存放获取的对象
<span style="white-space:pre">	</span>public Text showScore;
<span style="white-space:pre">	</span>private int score=0;
<span style="white-space:pre">	</span>// Use this for init<span style="white-space:pre">	</span>ialization
<span style="white-space:pre">	</span>void Start () {
<span style="white-space:pre">		</span>player = GameObject.Find ("player");//找到player对象,并与之绑定
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>// Update is called once per frame
<span style="white-space:pre">	</span>void Update () {
<span style="white-space:pre">		</span>
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>//FixedUpdate可以在多祯中运用力
<span style="white-space:pre">	</span>void FixedUpdate(){
<span style="white-space:pre">		</span>if (Input.GetKey (KeyCode.A)) {//如果长按A
<span style="white-space:pre">			</span>player.GetComponent<Rigidbody>().AddForce (-10, 0, 0);//在-x方向上添加大小为10的力
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>if (Input.GetKey (KeyCode.D)) {
<span style="white-space:pre">			</span>player.GetComponent<Rigidbody>().AddForce (10, 0, 0);
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>if (Input.GetKey (KeyCode.W)) {
<span style="white-space:pre">			</span>player.GetComponent<Rigidbody>().AddForce (0, 0, 10);
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>if (Input.GetKey (KeyCode.S)) {
<span style="white-space:pre">			</span>player.GetComponent<Rigidbody>().AddForce (0, 0, -10);
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>void OnTriggerEnter(Collider collider){
<span style="white-space:pre">		</span>if (collider.tag == "pickUp") {
<span style="white-space:pre">			</span>Destroy (collider.gameObject);
<span style="white-space:pre">			</span>score = score + 1;
<span style="white-space:pre">			</span>showScore.text = score.ToString();
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值