Unity2d 5.1 弱联网游戏制作 (一)场景创建、添加组件、精灵移动、主摄像机跟随

来源:互联网 发布:r语言与数据挖掘 pdf 编辑:程序博客网 时间:2024/05/22 04:37

先用Unity2d来做一个弱联网游戏热热身吧!

网上关于Unity2d的实例教程似乎比较少,要不就是比较老了,所以用u2d做吧,关键是做起来轻松。

我对游戏的基本构思是这样的,玩法很简单,直接说吧。主角一出来,只能往前冲,有一个加速键和一个跳跃键,一路上会遇到许多可破坏物体,我们拉风的主角就会一路势如破竹的撞飞、撞烂这些东西,然后根据撞击的姿势水平(速度,角度(?)、连击)来计分,同时路上还会有一些障碍物,主角碰到以后速度会归零,在速度加上去之前,一些大的物件就撞不动了(同样,如果速度过小,遇到大宗物品,同样会使得速度归零)。

另外途中还会有一些道具,如加速、狂暴状态等等。

整个游戏比较简单,有 关卡选择、关卡评分(三星)、注册登录、提交成绩、排行榜 等功能,好了,闲话不多说了,直接开始吧。

(注:本系列面向稍微有一点点编程基础,或者无编程基础,但智商正常的人。废话指数二星半)。


首先,打开u3d界面

 图片

选择2D


 

右键工程面板,在Assets目录下创建Scene目录用来存放场景(名称随意)

Create------>Folder

图片

工程打开便建立了一个场景,我们先来保存这个场景


在右上角找到File ------->Save Scene

图片



 

找到我们创建的目录,保存。

然后我们用一张图来简单介绍一下u3d的界面


图片


现在我们点Scene旁边的那个Game  可以看到游戏运行时的界面

啥也没有,一片蓝色。

当然是啥也没有,我们还没添加东西呢。


好了,首先,我们添加一个Sprite  (精灵)  作为我们的主角。

图片


这里我有一张用TexturePacker合好了的图,然后用U3d分割成了这样的图片,怎么分割呢

图片


选中图片,在检视面板中找到 Sprite Mode选项,选择Multiple  ,然后选择Sprite Editor(会跳出是否应用的窗口,选择Apply)

然后在弹出的窗口中

图片

可以自己调整,不过我们可以方便点,点击左上角的Slice


Type里有网格模式和自动模式,我们选择自动模式,然后点击Slice

图片

一张图就分好了。



我们直接把图片拖到场景窗口中,U3d会自动为我们生成一个精灵


图片

记得在检视面板中将其坐标归零

图片


现在我们为这个可爱的小家伙添加一个刚体组件和碰撞组件,让他具有物理属性

图片

这是刚体,注意选2D


碰撞盒子,也选2D的

图片

这时候我们运行一下游戏


图片



发现他自己掉下去了(而且还会有动画,我们添加精灵的时候U3D为我们自动生成了一个帧动画)



我们看到刚体组件的信息,从上往下四个输入框依次是   质量、阻力、角阻力、重力,我们把Gravity 调小,再运行,降落就变慢了。

图片

好了,为了防止他掉出屏幕以外,我们要建立一个地板


选择菜单栏顶部的GameObject------>create empty 创建一个空物体,并为他添加碰撞组件



我们可以通过这些组件调整他的位置和大小,也可以用检视面板中的Transform组件调整,尝试一下吧

图片



调整成这样

图片


再运行,我们的主角掉到地面的位置便不会往下了

图片


好了,让我们来些第一个脚本,控制主角的移动


新建一个文件夹,存放脚本,右键,Create--------> C#


自己命个名(比如我的叫MainConter),双击打开他


[csharp] view plaincopy
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class MainConter : MonoBehaviour {  
  5.     public float speed = 200.0f;    //水平方向力大小  
  6.     public float jumpspeed =200.0f; //垂直方向力大小  
  7.     public float x;//中间变量 用来表示水平方向的力  
  8.     public float y;//同上  
  9.     public bool infloor = true//判断是否在地面  
  10.     public Vector3 playe_post;  //返回给主摄像机的位置信息  
  11.     Quaternion left = new Quaternion (0, 0, 0, 0);//朝左  
  12.     Quaternion right = new Quaternion (0,-180,0,0);//朝右  
  13.     public Transform player_obj;  
  14.     // Use this for initialization  
  15.     void Start () {  
  16.         player_obj = gameObject.GetComponent<Transform> ();//获取Transform组件  
  17.     }  
  18.       
  19.     // Update is called once per frame  
  20.     void Update () {  
  21.   
  22.     }  
  23.   
  24.     void FixedUpdate()  
  25.     {  
  26.         x = Input.GetAxis ("Horizontal") * speed*Time.deltaTime;//这里是多此一举,下面会说明  
  27.         if (x > 0) {  
  28.             player_obj.rotation = right;  
  29.         } if(x<0)  
  30.             player_obj.rotation = left;  
  31.         Vector3 maxspeed = transform.InverseTransformDirection(GetComponent<Rigidbody2D> ().velocity);  
  32.         float absx = maxspeed.x;  
  33.   
  34.         if (Mathf.Abs(absx)<10)  
  35.             GetComponent<Rigidbody2D>().AddForce (new Vector2 (x, 0));  
  36.         if (Input.GetButtonDown ("Vertical")) {  
  37.             jump();  
  38.         }  
  39.         playe_post = gameObject.GetComponent<Transform> ().position;  
  40.         playe_post.y +=1.5f;  
  41.         playe_post.z -=10;//这个变量是为了给主摄像机,让其跟随主角移动的  
  42.     }  
  43.   
  44.     void jump()//跳跃  
  45.     {  
  46.         if (infloor == true) {  
  47.             infloor = false;  
  48.             GetComponent<Rigidbody2D>().AddForce (new Vector2 (0, jumpspeed));  
  49.         }  
  50.     }  
  51.     void OnCollisionEnter2D(Collision2D Collision)  
  52.     {  
  53.         infloor = true;  
  54.     }  
  55. }  

脚本比较简单,搭配上注释,应该比较好理解,重点说一下几个东西:


首先,HorizontalVertical

这两个是U3D的两个输入组件,可以在Edit---------->project settings--------->Input中打开


注意negative button 和 positive button 两个选项,前者所代表的按钮按下时返回负值,后者按下时返回正值


另外说一下

FixedUpdate()

他和Update()的区别在于


FixedUpdate()是以固定的时间间隔执行

Update()是每帧执行 

因为每帧的时间不会是一样的,所以在Update()中,我们应该乘以一个Time.deltaTime以保障每次输入的结果是一样的,但是在FixedUpdate中就没这个必要了。


另外注意那个

Vector3 maxspeed= transform.InverseTransformDirection(GetComponent<Rigidbody2D> ().velocity);

if (Mathf.Abs(absx)<10)
GetComponent<Rigidbody2D>().AddForce (new Vector2 (x, 0));


这是用来限制最大速度的。

另外跳跃的话也比较明白,只能跳跃一次,碰到地面后可以再次跳跃。


把脚本拖拽到精灵上添加,

我们再运行游戏,通过wasd键,主角便可以移动了。


我们发现主角不管怎么动,镜头还是原来的位置,主角移动到一定程度后就不见了。

好了,我们给主摄像头写一个简单的脚本

[csharp] view plaincopy
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class camera_follw : MonoBehaviour {  
  5.     public GameObject player;  
  6.     public Transform MainCamera;  
  7.     // Use this for initialization  
  8.     void Start () {  
  9.       
  10.         player = GameObject.Find ("player");//主角物体的名称  
  11.         MainCamera = gameObject.GetComponent<Transform> ();  
  12.   
  13.     }  
  14.       
  15.     // Update is called once per frame  
  16.     void Update () {  
  17.         MainConter post = player.GetComponent<MainConter> ();  
  18.         MainCamera.position = post.playe_post;  
  19.     }  
  20. }  

把脚本拖给主摄像头,再运行,我们发现无论主角怎么移动,摄像头都会跟着他走了。


0 0