您的位置:首页 > 移动开发 > Unity3D

Unityr入门操作_2D游戏制作_039

2017-09-04 21:13 239 查看
2d游戏是指二维交互式动画,也就是我们通常所说的‘2d动画’。

二维交互式动画的基本特征如下(主要是针对3d游戏):

⒈贴图(参考上一篇)

传统的2d游戏中的美术资源(人物行走、人物状态、地图等等)都是以png或jpg的图形文件渲染而成,而3d游戏中的美术资源多数是以模型为主.

⒉视角(正交)

2d游戏是没办法完成视角转换的.因为2d游戏的美术资源是平面图.即某种美术资源的前、后、左、右不能够同时出现在游戏里.但3d游戏却可以完成视角转换.

⒊渲染(两者的差异)

2d游戏的所有美术资源可以不经过引擎的渲染就能使用,但3d游戏的任何美术资源都必须经过引擎的渲染才能使用.

操作流程:

1首先我们要建立一个2D的工程(区别于3D的)(Unity4.3增加了原生的2D开发环境。):



创建完成后如下图:(此时没有灯光)



此时我们可以把2D变为3D:

首先我们要添加一个灯光



然而场景还是2D的,此时我们就要做下图的操作





这样场景就变为3D的了,但这只能修改一个场景,再次生成场景时,系统依旧默认是2D场景,如果你想更改这个设置,可以选择”Edit\Project Settings\Editor”打开编辑器设置,在”Default Behavior Mode”中改模式为2D,如下图:



“Default Behavior Mode”(默认行为模式)定义你项目在导入Assets时的默认导入设置,当设置为3D模式时,Unity假设你将导入的文件创建为纹理类型(如:PNG文件);当设置为2D时,Unity假定你想要的导入的资源为Sprite类型

2创建工作层

为了使游戏对象在场景中的层次不会错乱,可以创建不同的工作层来管理游戏对象,从而使2D游戏 场景的层次更加分明,游戏对象之间的操作也更加方便

设置层的途径如下:

Edit–>Project Settings–>Tags and Layers命令或者直接单击编辑器的右上方的Layers–>Edit Layers然后添加工作层



点击+号来添加工作层

接下来我来做一个2D的效果:

首先是导入资源

然后我们要做一个大背景



我们先来装饰一下天空(加个移动的动物)

首先将动物图片进行切割



然后创建序列帧动画,

添加一个2D游戏对象将第一个动画填入其中



点击对象然后Ctrl+6进入面板将所有这一序列帧图画拖入其中



修改samples值来调节动画执行的速度



这时我们就需要编写脚本来控制对象的移动

using UnityEngine;

using System.Collections;

public class SwaFly : MonoBehaviour {

//起飞点
private Vector3 startPosition;
//飞速
public float speed;
// Use this for initialization
void Start () {
//这里的高度和宽度经测验发现是屏幕大小的一半
Debug.Log(Screen.width);
Debug.Log(Screen.height);
Vector3 screenSize = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, 0));
Debug.Log(screenSize);
float swanExtentsX = transform.GetComponent<Renderer>().bounds.extents.x;
transform.position = new Vector3(screenSize.x + swanExtentsX, transform.position.y, transform.position.z);
startPosition = transform.position;
}
// Update is called once per frame
void Update () {
//if (transform.position.x < -startPosition.x)
//{
//    transform.position = startPosition;
//}
if (transform.position.x < -startPosition.x)
{
transform.Rotate(Vector3.up*180);
}
if (transform.position.x> startPosition.x)
{
transform.Rotate(Vector3.up * -180);
}
transform.Translate(Vector3.right*-1*speed*Time.deltaTime);
}


}



这时我们就要装饰地面了

我们可以添加几块土地,创建一个复制Ctrl移动



这是我们要考虑给地面加组件了(区别于3D我们这时添加组件都要添加2D的)





Linear Drag(摩擦力)

Angular Drag(旋转角摩擦力)

Gravity Scale(重力)

Constraints(冻结轴)



编写脚本随机生成

using UnityEngine;

using System.Collections;

public class CreateBall : MonoBehaviour {

//产生范围
private float createRange;
public GameObject objBall;
//产生时间
public float rate;
// Use this for initialization
void Start () {
Vector3 screenSize = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, 0));
float ballExtentsX = objBall.transform.GetComponent<Renderer>().bounds.extents.x;
createRange = screenSize.x - ballExtentsX;
}
// Update is called once per frame
void Update () {
rate -= Time.deltaTime;
if (rate<0)
{
Vector3 position = new Vector3(Random.Range(-createRange, createRange), transform.position.y, transform.position.z);
GameObject ball = Instantiate(objBall, position, Quaternion.identity) as GameObject;
//下一个产生的时间,使游戏更随机
rate = Random.Range(0,2.5f);
Destroy(ball, 3);
}
}


}

显现如下:



这时我们可以再添加一个游戏对象(针对碰撞器):

这是一种线性碰撞器



添加并编辑



这时我们要注意,程序运行时我们会发现如果保龄球进入帽子是画风比较尴尬,



这时就要用到层的深度了越深的层越后渲染,每层中越深越后渲染





添加粒子系统:



还是同一个注意点,注意层数和深度,否则粒子特效会被遮盖住。

帽子移动和粒子系统生效的脚本

using UnityEngine;

using System.Collections;

public class HatMove : MonoBehaviour {

private float hatMoveRange;
public GameObject particleSystemPoint;
public GameObject particle;
// Use this for initialization
void Start () {
Vector3 screenSize = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width,Screen.height,0));
float hatExtentsX = transform.GetComponent<Renderer>().bounds.extents.x;
hatMoveRange = screenSize.x - hatExtentsX;
}
// Update is called once per frame
void Update () {
Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
float x = Mathf.Clamp(mousePosition.x, -hatMoveRange, hatMoveRange);
transform.position = new Vector3(x, transform.position.y, transform.position.z);
}
void OnTriggerEnter2D(Collider2D col)
{
GameObject objtemp = Instantiate(particle,transform.position, Quaternion.identity)as GameObject;
Destroy(col.gameObject);
Destroy(objtemp,1);
}


}

效果图如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  游戏制作 动画