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

智能推荐

通用漏洞评估方法CVSS3.0详解_cvss方法_ToEof的博客-程序员秘密

CVSS(Common Vulerability Scoring System, 通用漏洞评估方法),是由NIAC 发布、FITST维护的开放式行业标准,CVSS 的发布为信息安全产业从业人员交流网络中所存在的系统漏洞的特点与影响提供了一个开放式的评价方法。1.度量(Metrics)CVSS3.0由三个基本尺度组成,基本(Base):代表着漏洞的原始属性,不受时间与环境的影响,又由Ex...

YOLO系列算法原理讲解----(3)Yolov3算法_yolov3算法原理_奔跑的小仙女的博客-程序员秘密

YOLOV3介绍速度和精度均衡的目标检测网络融合多种先进方法,改进YOLOV1/V2缺点,且效果更优小物体检测YOLOV3改进策略:更好的主干网络(类ResNet)多尺度预测(类FPN)更好的分类器具体如下:YOLOV3改进策略:- 更好的主干网络精度更好对比如下:可以看得到采用ResNet可以获得更好的检测效果。- 多尺度预测(类FPN)聚类来得到Bb...

使用ESP8266播放音乐_esp8266扬声器_James.OuYang的博客-程序员秘密

使用工具:NodeMCU开发板、Arduino IDE1.安装Arduino IDE 1.8.10,点击下载,根据提示安装完成。2.下载ESP8266支持包,点击下载,双击等待完成。3.打开Arduino IDE>工具>开发板即可看到对ESP8266相关的支持,如下图:4.添加SPIFFS环境,点击下载,解压复制ESP8266FS到Arduino IDE安装目录to...

logging模块详解_这个异常不抛出的博客-程序员秘密

简单将日志打印到屏幕:[python] view plain copy import logging  logging.debug('debug message')  logging.info('info message')  logging.warning('warning message')  logging.error('err

HttpClient实现登录功能_httpclient 登录_Mr. 码农的博客-程序员秘密

在很多APP里面,用户注册、登录的功能是必不可少的,登录功能的原理就是将本地的数据POST到服务器端,服务器接收到数据之后返回一个Json。客户端获取到返回的Json数据并对其解析,其中有个加密的标识符进行判断,如果是肯定的标识符则可以登录,如果是失败的标识符则提示错误信息。 首先给一个登录的按钮增加一个点击事件,点击按钮的时候弹出一个正在登录的对话框,然后执行线程:mDialog = ne

Linux驱动开发(从零开始编写一个驱动程序)_学习&笔记的博客-程序员秘密

1、系统整体工作原理(1)应用层->API->设备驱动->硬件(2)API:open、read、write、close等(3)驱动源码中提供真正的open、read、write、close等函数实体2、file_operations结构体(用来挂接实体函数地址)(1)元素主要是函数指针,用来挂接实体函数地址(2)每个设备驱动都需要一个该结构体类型的变量(3)设备驱动向内核注册时提供该结构体类型的变量3、注册字符设备驱动驱动向内核注册函数register

随便推点

Python爬虫的用途_网络爬虫的主要功能_lmseo5hy的博客-程序员秘密

Python爬虫是用Python编程语言实现的网络爬虫,主要用于网络数据的抓取和处理,相比于其他语言,Python是一门非常适合开发网络爬虫的编程语言,大量内置包,可以轻松实现网络爬虫功能。Python爬虫可以做的事情很多,如搜索引擎、采集数据、广告过滤等,Python爬虫还可以用于数据分析,在数据的抓取方面可以作用巨大!Python爬虫架构组成1. URL管理器:管理待爬取的url集...

sql:谓词_Cytues的博客-程序员秘密

谓词就是返回值为真值的函数。1.like谓词:字符串的部分一致查询取ddd开头的字符串:select *from SampleLikewhere strcol like 'ddd%';%代表0字符以上的任意字符串,是通配符其中的一种2.between谓词:范围查找选取销售单价为100-1000的商品:select product_name, sale_price...

tomcat中部署好的项目,内网和localhost可以访问,但是外网不能访问(Windows 2008 R2中)_tomcat 项目不对外_hsj1213522415的博客-程序员秘密

在Windows 2008 R2用tomcat搭建环境能够运行web项目,在本地用localhost或者内网可以访问网站,但是外网均无法访问网站,发现有两种可能性致使这种情况发生:1.防火墙屏蔽80端口,需要在防火墙中允许外网对80端口的访问,但是这对服务器来说极不安全:具体

dw写html怎么自动缩进,DW中文首行缩进实现技巧_朱晓光指数投资的博客-程序员秘密

方法1:预格式化标签<PRE><PRE>是HTML语言中控制版式的一个标签,但现在的网页设计人员好像不是很常用它。在HTML语言规范中,被<PRE></PRE>标签包含的文字将按输入时的格式显示。对于加上<PRE>标签的文字,浏览器将以等宽字体预先显示格式化的文本,而不会合并文字之间的空格距离和进行行两端对齐。在格式化中文段落,尤其是诗词时,<PRE>的作用就显得很重要了。首先打开原始文档,在欲复...

ndk-build使用说明_ndk-build arm64_csfchh的博客-程序员秘密

ndk-build是上一代android ndk开发编译工具,尽管现在官方推荐使用CMake,AS默认的工具也切换成了后者,但是仍有必要对ndk-build有一定了解,以求:知道ndk-build如何使用;知道如何从ndk-build项目切换到CMake;还是先回顾一下NDK开发的步骤:在java类文件中编写native接口;借助AS代码提示自动生成或者使用javah命令生成.h头文件;新建c/cpp文件引入头文件并实现接口函数;配置编译选项编译成so文件(ndk-build或CMake

python中pack的用法_Python中struct.pack()和struct.unpack()用法详细说明_weixin_39890332的博客-程序员秘密

python中的struct主要是用来处理C结构数据的,读入时先转换为Python的字符串类型,然后再转换为Python的结构化类型,比如元组(tuple)啥的~。一般输入的渠道来源于文件或者网络的二进制流。1.struct.pack()和struct.unpack()在转化过程中,主要用到了一个格式化字符串(format strings),用来规定转化的方法和格式。下面来谈谈主要的方法:1.1 ...

推荐文章

热门文章

相关标签