Unity3D游戏开发从零单排(二) - Roll a Ball_拳四郎的博客-程序员秘密

技术标签: 并发  android游戏  unity3d  游戏  游戏开发  

提要

本篇是Unity3D 官方Tutorial最简单的一篇 ,没有纹理,没有复杂模型,没有音乐,没有关卡,但作为入门学习还是非常不错的。

游戏很简单,就是用键盘的上下左右控制一个小球,获取场景中的所有的方块。

下面是个人的一点学习记录。


场景搭建

创建一个cube作为地面,然后用四个cube作为四个墙。

添加一个小球在中央。

添加12个0.5*0.5*0.5的方块,Rotation的x,y,z都绕45度。场景搭建好之后就像这样。

添加两个UI Text,一个用来计数,一个用来显示游戏结束。

两个方向光源,一个照射地面,一个表示地面的反光,强度小一些。



控制脚本

首先是方块,让它一直旋转

using UnityEngine;
using System.Collections;

public class Rotate : MonoBehaviour {	
	// Update is called once per frame
	void Update () {
	 	transform.Rotate(new Vector3(15, 30, 45) * Time.deltaTime);
	}
}

然后是摄像机,让它跟随小球运动

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 LateUpdate () {
		transform.position = player.transform.position + offset;
	}
}

最后是小球的运动,主要控制键盘输入,更新UI Text。

using UnityEngine;
using System.Collections;

public class PlayController : MonoBehaviour {
	
	public float speed;
	private int count;
	public  GUIText countText;
	public GUIText winText;
	 
	void Start()
	{
		count = 0;
		SetCountText();
		winText.text = "";
	}
	void FixedUpdate()
	{
		float moveHorizontal = Input.GetAxis("Horizontal");
		float moveVertical = Input.GetAxis("Vertical");
		
		Vector3 movement = new Vector3(moveHorizontal, 0, moveVertical);
		
		rigidbody.AddForce(movement * speed * Time.deltaTime);
	}
	
	void OnTriggerEnter(Collider other)
	{
		if(other.gameObject.tag == "PickUp")
		{
			other.gameObject.SetActive(false);
			++count;
		}
		SetCountText();
	}
	
	void SetCountText()
	{
		countText.text = "Count: " + count.ToString();
		if(count >=12)
		{
			winText.text = "You win!";
		}
	}
}

都非常简单。

最后运行起来就像这样:



小练习

记录游戏时间,最后显示

在控制小球的脚本中添加一个private变量speedTime,在Start()中初始化为当前时间:

spendTime = Time.time;

在SetCountText()中,当游戏结束的时候更新spendTime并显示:

spendTime = Time.time - spendTime;
winText.text = "You win! cost " + spendTime + "s.";


添加重力感应控制,并发布到android上

重写FixUpdate方法:

	void FixedUpdate()
	{
		float moveHorizontal = Input.GetAxis("Horizontal");
		float moveVertical = Input.GetAxis("Vertical");
		
		if(Input.acceleration.x != 0 || Input.acceleration.y != 0)
		{
			moveHorizontal = Input.acceleration.x;
			moveVertical = Input.acceleration.y;
		}
		
		Vector3 movement = new Vector3(moveHorizontal, 0, moveVertical);
		
		rigidbody.AddForce(movement * speed * Time.deltaTime);
	}

在build setting里设置为横屏幕



build and run就可以了。

Android里面的运行没有实时阴影。



小知识点

三种update

update、FixUpdate和LateUpdate

Update会在每次渲染新的一帧时,被调用。而FixedUpdate会在每个固定的时间间隔被调用,那么要是Update 和FixedUpdate的时间间隔一样,是不是就一样呢?答案是不一定,因为Update受当前渲染的物体,更确切的说是三角形的数量影响,有时快有时慢,帧率会变化,update被调用的时间间隔就发生变化。但是FixedUpdate则不受帧率的变化,它是以固定的时间间隔来被调用,那么这个时间间隔怎么设置呢?Edit->Project Setting->time下面的Fixed timestep。

LateUpdate是在所有Update函数调用后被调用,和fixedupdate一样都是每一帧都被调用执行,这可用于调整脚本执行顺序。例如:当物体在Update里移动时,跟随物体的相机可以在LateUpdate里实现。LateUpdate,在每帧执行完毕调用,他是在所有update结束后才掉,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现


dynamic 和static

含有Collider和RigidBody的GameObject, Unity视之为Dynamic
含有Collider的GameObject, Unity视之为Static
如果Static的物体发生位移上的变化,Unity每一帧都会去重新缓存Static物体的Collider状态,这会消耗资源
所以只含有Collider的物体,就不要让他发生位置上的移动。或者给它加一个RigidBody的组件,把Gravity去掉,并且把IsKineMatic勾选上(该选项使得该物体不会因为其他物体的影响而发生物理上的改变)。


下载

工程下载

视频教程下载


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qp120291570/article/details/21745939

智能推荐

JFace下ApplicationWindow关闭窗口时结束进程_weixin_30702887的博客-程序员秘密

/** * Configure the shell. * @param newShell */ @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell.addLi...

sqlserver多行多列转一行多列_sqlserver多行转多列_haokan_Jia的博客-程序员秘密

https://zhidao.baidu.com/question/871893841426870532.html1.学习记录,简单可用很不错!1、创建测试表,create table test_fee(userid number, feeid number, fee number);2、插入测试数据insert into test_fee values(1,1001,80);insert into test_fee values(1,1002,70);insert into test_fee

How To Become A Hacker_铁猴的博客-程序员秘密

自从接触计算机开始,黑客在我心里一直是即神秘又高深的角色,kevin mitnick的简介总是不厌其烦的看了一遍又一遍,每次看完也都会让我的内心在滚动,可是一直没有涉及到这个领域,这对我而言也真是个遗憾.转眼间工作已经三年,回头看看这三年觉得平淡而无味,刚工作时总是希望可以在技术路线上好好的发展,可是有一次面试的时候,一位面试官问我,"你认为什么是技术?"的时候,我却说不出个所以然来了,那次面

Java中的String、StringBuilder以及StringBuffer_weixin_30687811的博客-程序员秘密

 一.你了解String类吗? 二.深入理解String、StringBuffer、StringBuilder 三.不同场景下三个类的性能测试 四.常见的关于String、StringBuffer的面试题(辟谣网上流传的一些曲解String类的说法)一.你了解String类吗?想要了解一个类,最好的办法就是看这个类的实现源代码,String类的实现在\jdk1.6.0_14...

Linux命令速查手册,超详细Linux命令教程_linux基本命令手册_Liu-_--的博客-程序员秘密

一、常用命令速查lscdpwdcatmorelesstailheadcpscpmvmkdirrmdirtouchrmpskilltopfreecleartreewc

随便推点

mybatis与jdbc比较_hello_world!的博客-程序员秘密

https://blog.csdn.net/u011305680/article/details/60879953 ...

python中True和False与字符串True和False_字符串的波尔是true还是false_wddzz的博客-程序员秘密

python中字符串"True"、"False"无发转化为bool类型,字符串的bool值都为True。在配置文件config.ini中如果定义一个变量为bool值,则无效,得到的是字符串,如下:       在config.ini文件中:                                       [Controler]                      ...

Telnet详解及配置命令_telnet配置命令_偷轮子的博客-程序员秘密

Telnet详解及命令配置一、Telnet应用场景如果企业中有一台或者多台设备需要远程进行配置和管理,就可以使用telnet命令远程连接到每一台设备上,对这些网络设备(需要提前配置vty虚拟终端供telnet连接,否则telnet无法连接)进行集中的管理和维护。本文章主要从以下三个角度来讲解Telnet。Telnet应用场景 Telnet工作原理 Telnet基本配置二、Telnet工作原理...

Failed to instantiate [org.springframework.data.domain.Pageable]: Specified class is an interface_jesselydia的博客-程序员秘密

解决方法,那就是在XML配置文件中加入下面的代码mvc:annotation-driven> mvc:argument-resolvers> bean class="org.springframework.data.web.PageableHandlerMethodArgumentResolver" /> mvc:argument-resolvers>mvc:annotation

openlayers叠加天地图经纬度投影瓦片_天地图 经纬度投影_yrlzmm的博客-程序员秘密

openlayers版本  Release 2.12之前写了一篇openlayers叠加天地图魔卡托瓦片的文章,发现有朋友不知道怎么叠加经纬度(WGS84)投影的瓦片,今天在原来的基础上做了一些修改,发上来大家看看,标点、标线、标面的大家参考吧 openlayers 加载天地图地图 点击地图可获取鼠标点击位置屏幕坐标及经纬度

java运用Tomcat实现简单的登录_弦語的博客-程序员秘密

Tomcat配置index.jsp配置<%@ page contentType="text/html;charset=UTF-8" language="java" %><html> <head> <title>$Title$</title> </head> <body> <form action="/login" method="post"> name:<input

推荐文章

热门文章

相关标签