一女黑夜遇抢劫,颤抖曰:“大哥,我是搞java的,两个月没发工资了,还刚被裁员,你看报道就知道了,真的没有钱… …”
劫匪听后竟然痛哭流涕,“妹子,同行,俺原来是做C++的,金融危机闹得做劫匪也
不踏实,你拿好工牌,后面那帮抢劫是做.NET的,你放心,我们绝不抢自己人。”
“对了,边上那条路不要走,那边是搞PHP的… …”

下载 Fantasy Skybox FREE, 构建自己的游戏场景

点击菜单中的windows->assert store,打开商店窗口,搜素想要的资源,下载添加到仓库。

然后回到unity,点击windows ->package manager,就能找到自己的资源,全部import



unity Instantiate 就不是 prefab 了 有什么办法 unity instantiate作用_unity instantiate

这里是获取场景后的结果:

unity Instantiate 就不是 prefab 了 有什么办法 unity instantiate作用_unity instantiate_02

简单总结游戏对象的使用

游戏对象的属性

从目前来看,我们最常使用的属性是位置,尺寸等,可以通过:

Object.transform.position=new Vector(x,y,z);

Object.transform.position=new Vector(x,y,z);

对象可能不止包含基本信息,还可以包含许多component(组件),可以通过按钮

unity Instantiate 就不是 prefab 了 有什么办法 unity instantiate作用_unity游戏存档修改_03

来为对象添加组件,组件有自己的属性,功能等。对于复杂的特殊组件,一般通过按钮添加,如果想添加自定义的代码,就是用:

object.AddComponent(typeof(class_name))

object.AddComponent(typeof(class_name))

其结果相当于把class打包进入一个cs文件,并添加到对象里,这个类必须继承MonoBehaviour

要获取组件:

object.GetComponent()
object.GetComponent()

返回值是组件,可以在获取组件后通过组件内的函数,改变组件的一些值。

对象的加载

简单加载

最简单的加载方式,就是直接用鼠标把对象拖到左上角的窗口中,然后手动设置属性。

但是这样会耗费大量的时间去加载。(如果有许多个对象是相同的,系统会重复加载,耗时)

而且有许多对象是在游戏中途才生成的。为了游戏流畅性,在开始就要加载,但是不显示,这种简单加载做不到。

用代码加载

首先对象必须放在Assert/Resources文件夹中,这个Resources文件夹是特殊的,如果没有请自己建立,把需要用到的资源加载进去

source=Resources.Load<type>(location)

source=Resources.Load<type>(location)

返回一个对象(只加载,不显示),这里的location是一个地址,一个以Resources文件夹为根的相对地址。

但后把资源显示在地图中

object=Instantiate(source,Vector3,Quaternion)

object=Instantiate(source,Vector3,Quaternion)

这样对象就会显示出来,由于之前加载了,这是会很快把对象显示出来,避免卡顿

对象移动

通过修改object.transform.position可以实现最直接的修改,此外还提供了函数,放在Update中:

Vector3.MoveTowards(Vector3 now,Vector3 target,float speed)
Vector3.Slerp(Vector3 start,Vector3 end,float 百分比)

Vector3.MoveTowards(Vector3 now,Vector3 target,float speed)
Vector3.Slerp(Vector3 start,Vector3 end,float 百分比)

一般这两个就很强大了。如果要移动抛物线等,可以通过物理引擎加入rigid body,也可以自己定义复杂的算法。

此外Rotate,RotateAround分别进行旋转和自转,两个函数都在transform组件中,自查

对象操作

在前面的属性中已经提到了改变组件的方法改变对象,这里还有:

点击事件
class ClickEvent :MonoBehaviour{
 void OnMouseDown(){
  
 }
}

class ClickEvent :MonoBehaviour{
 void OnMouseDown(){
  
 }
}
碰撞检查

首先要给物体加入组件collider,定义碰撞体的形状,体积等

class CollisionEvent :MonoBehaviour{
 void OnCollisionEnter(Collision c){
  
 }
 
 void OnCollisionStay(Collision c){
  
 }

 void OnCollisionExit(Collision c){
  
 }
}

class CollisionEvent :MonoBehaviour{
 void OnCollisionEnter(Collision c){
  
 }
 
 void OnCollisionStay(Collision c){
  
 }

 void OnCollisionExit(Collision c){
  
 }
}

游戏玩法

闯关游戏,通关就行,总共有三个地图,也就是序章,主题,终章。这只是个小demo,并没有太长的流程。

所谓“麻雀虽小,五脏俱全”,如果加以时日,可以做大,做美

成果展示

这只是一张截图:

unity Instantiate 就不是 prefab 了 有什么办法 unity instantiate作用_unity 随机数_04


通关视频https://www.bilibili.com/video/BV1hf4y1i7N8/

幻影道路

游戏中有一个跳跳乐关卡,里面的物体快只有离近了才能看见,而且踩上去很快就会消失,这是反应的比拼,如果不能反映过来下一个点的位置,就会死掉。

那么物体透明度的调节如下:

Color c;
c=this.GetComponent().material.color;
c.a= X 
this.GetComponent().material.color=c;
Color c;
c=this.GetComponent().material.color;
c.a= X 
this.GetComponent().material.color=c;

摩擦力?一起运动!

游戏中有很多移动的平台,如果踩在这些移动的平台上,会与平台一起运动,这非常像是现实中的摩擦力。

这是通过一起运动做到的,如果主角碰撞到某些平台,就会获得和平台当前速度一样的额外速度

易错点主角的额外位移必须与平台放在同一个Update函数中,而不是分开。不同物体的Update不是一起执行的,如果位移函数分开,我们看到的物体会延迟一帧,具体情况是看到平台在脚下抖动(鬼畜)

BOSS总是盯着我看?

通过Quaternion提供的函数转向

boss.transform.rotation =Quaternion.Slerp(boss.transform.rotation, Quaternion.LookRotation(me.transform.position - boss.transform.position), 10 * Time.deltaTime);

boss.transform.rotation =Quaternion.Slerp(boss.transform.rotation, Quaternion.LookRotation(me.transform.position - boss.transform.position), 10 * Time.deltaTime);

被打了屏幕闪红光

闪红光的本质是一张纯红色的Texture2D贴图,通过调节它的透明度渐变。

GUI.color.a就是透明度,取值为0-1,函数自定义

例如:

c=GUI.color;
c.a=(0.4f+0.2f*depth)-(Time.time-damtime)*(0.4f+0.2f*depth);GUI.color=c;
GUI.Label(new Rect(-10,-10,2112,1188),reds);

c=GUI.color;
c.a=(0.4f+0.2f*depth)-(Time.time-damtime)*(0.4f+0.2f*depth);GUI.color=c;
GUI.Label(new Rect(-10,-10,2112,1188),reds);

保存点

如果多死几次就发现,即使点击重玩,游戏也不会回到最开始的地方,而是从死亡的关卡开始。仿佛游戏会自动保存一样。

实际上由于存档很简单,我们直接使用一个static变量就搞定了:

public static int load=0;

public static int load=0;

这个变量就记录着你已经到达了第几关,从而直接将主角传送过去。

每次重玩是,用SceneManager.LoadScene(“XXX”)函数,重新加载当前场景,但是只有static变量不会重新加载,就仿佛是简单的存档一样。

通关视频展示请移步:

通关视频https://www.bilibili.com/video/BV1hf4y1i7N8/

项目代码和资源链接:

项目传送门 (资源太多了,直接发的压缩包)https://gitee.com/lhyyes/unity-game-homework/tree/master/dazhuzai

使用方法:

新建项目,在新项目中删除所有Asserts中文件

解压仓库中的dazhuzai_Asserts.zip文件,里面有我的资源库,用我的Asserts覆盖你的Asserts(粘贴过去),然后刷新等待

在unity中打开Asserts/Scenes文件夹,将里面的五个文件全都加入File–>Build setting中,双击first,进入名叫“first”的scene中,点击运行。