第一课:案例介绍
如何改变默认2D/3D默认游戏开发模式:Edit -> Project Settings -> Editor -> Default Behaviour Mode(2D/3D)
第二课:添加背景
1.导入资源,我这里采用的是直接将资源复制到Assets文件下
2.将Sprite的Texture Type设置为Sprite(2D and UI)
3.直接将BG拖到Hierarchy面板下,添加一个名为BackGround的Layer,并选择锁定BackGround层
4.添加一个名为BackGround的sorting Layer并设置此层,将此层拖到默认层的上边
5.Layer Sorting Layer Order in Layer(值越大越先渲染)
第三课:设计Player预制体
1.将Sprites下的player拖拽到Hierarchy面板下
2.调整位置,添加Box Collider 2D组件和Rigidbody 2D组件,并调整碰撞盒子的大小,将物理组件的重力设置为0(不能掉下去)
3.给Player添加一个名为PlayerController移动的脚本组件
4.具体代码为: public KeyCode upKey;
public KeyCode downKey;
public float speed = 5;
private Rigidbody2D Rigidbody2D;
void Start() {
Rigidbody2D = GetComponent();
}
void Update() {
if(Input.GetKey(upKey)){
Rigidbody.velocity = new Vector2(0,speed);
}else if{
if(Input.GetKey(downKey)){
Rigidbody2D = new Vector2(0,-speed);
}else{
Rigidbody2D = new Vector2(0,0);
}
}
}
5.在Player的Inspector面板下指定upKey和downKey为w键和s键盘
第四课:添加围墙-UpWall
1.创建一个空物体CreatEmpty,重命名为GameManager
2.在GameManger游戏物体下创建上下左右围墙(UpWall,DownWall,LeftWall,RightWall)
3.分别添加Box Collider组件
4.添加脚本组件GameManger控制墙的生成位置
5.具体代码为:private BoxCollider upWall;
private BoxCollider downWall;
private BoxCollider leftWall;
private BoxCollider rightWall;
void Reset() {
upWall = transform.Find("UpWall").GetComponent();
downWall = transform.Find("DownWall").GetComponent();
leftWall = transform.Find("LeftWall").GetComponent();
rightWall = transform.Find("RightWall").GetComponent();
upWall.transform.position = Camera.main.ScreenToWorldPoint(new Vector2(Screen.width/2,Screen.height)) + new Vector3(0,0.5f,0);
float width = Camera,main.ScreenToWorldPoint(new Vector2(Screen.width,Screen.height)).x*2;
upWall.size = new Vector2(width,1);
}
第五课:完善围墙的生成
1.将之前生成UpWall的围墙注释掉,快捷键Ctrl+k,Ctrl+c
2.优化代码,具体的代码是:Vector2 tempPosition = Camera.main.ScreenToWorldPoint(new Vector(Screen.width,Screen.height));
upWall.transform.position = new Vector2(0,tempPosition.y+0.5f);
upWall.size = new Vector2(tempPosition.x*2,1);
downWall.transform.position = new Vector2(0,-tempPosition.y-0.5f);
dwonWall.size = new Vector2(tempPosition.x*2,1);
leftWall.transform.position = new Vector2(-tempPosition.x-0.5f,0);
leftWall.size = new Vector2(1,tempPosition.y*2);
rightWall.transform.position = new Vector2(tempPosition.x+0.5f,0);
rigthWall.size = new Vector2(1,tempPosition.y*2);
3.运行游戏,在Scene面板中查看墙的生成
第六课:控制Player的生成
1.控制Player的位置生成
2.具体代码如下:首先要注意MainCanera的Position的的z轴为-10,
public Transform player1;
public Transform player2;
void ResetPlayer() {
Vector3 player1Position = Camera.main.ScreenToWorldPoint(new Vector3(100, Screen.height/2,0));
player1Position.z = 0;
player.position = player1Position;
Vector3 player2Position = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width-100,Screen.height/2,0));
player2Position.z = 0;
player2.position = player2Position;
}
3.在GameManager脚本组件下给player1和player2赋值
第七课:添加小球
1.将小球的Sprite拖拽到Hierarchy面板下Reset
2.添加Circle Collider 2D和Rigidbody 2D并设置相关属性,摩擦力为0,质量0.2,重力为0
3.在2D物理组件中将小球的z轴的旋转锁定,添加一个2D的物理材质,赋值给Rigidbody 2D的Materials
4.将2D物理材质的Friction(摩擦力)设置为0,弹力设置为最大值1
5.添加一个名为BallMove的脚本组件,给它一个初始的力和方向
6.具体代码为: private Rigidbody2D rigidbody2d;
int number = Random.Range(0,2); //0和1,不包含最大数2
void Start() { rigidbody2d = gameObeject.GetComponent();
if(number == 1){
rigidbody2d.AddForce(new Vecctor2(100,0));
}else{
rigidbody2d.AddForce(new Vector2(-100,0));
}
}
7.Ctrl+s保存代码,运行游戏,发现小球类可以左右弹跳了
第八课:控制对小球的方向的影响
1.添加并设置Player的Tag标签为Player
2.在BallMove脚本中添加以下脚本:void OnCollision2D(Collision2D col){
if(col.collider.tag == "Player") {
Vector velocity = rigidbody2D.velocity;
velocity.y = velocity.y/2 + col.rigidbody.velocity.y/2;
rigidbody2d.velocity = velocity;
}
}
3.运行游戏,小球可以受到来自Player的y方向的力了
第九课:完善小球的移动
1.在每次和player碰撞后输出当前的速度
2.我们会发现小球在x轴的速度有时会降低
2.我们会发现小球在x轴的速度有时会降低
3.为了解决这个问题,我们可以每帧检测小球的速度,一旦在-9-9之间,我们就让他回到10或-10的速度
4.在Update函数中添加以下代码:void Update() {
Vector2 velocity = rigidbody.velocity;
if(velocity.x < 9 && velocity.x>-9 && velocity.x != 0) {
if(velocity.x > 0) {
velocity.x = 10;
}else{
velocity.x = -10;
}
rigidbody.velocity = velocity;
}
}
5.现在逐帧检测小球x方向的速度是否低于10,如果是,则变回10的速度
6.可以尝试用类似的方法尝试限制小球y方向的速度
第十课:添加计分功能
1.添加GUI Text组件显示,将锚点设置在中上位置,命名为Score1和Score2
2.改变Font Size的大小,上下左右居中,text设置为0
3.添加代码,实现加分功能,具体代码是:void OnCollisionEnter2D(Collision2D col) {
if(col,gameObject.name == "LeftWall" || col.gameObject.name == "RightWall") {
GameManager.Instance.ChangeScore(col,gameObject.name);
}
}
GameManager脚本内:
using UnityEngine.UI; //引入UI命名空间
//单例模式
private static GameManager _instance;
private int score1;
private int score2;
public Text textScore1;
public Text textScore2;
public static GameManager Instance {
get{return _instance;}
}
void Awake() {
_instance = this;
}
public void ChangeScore( string wallName) {
if(wallName == "LeftWall") {
score2++;
}else if(wallName == "RightWall") {
score1++;
}
textScore1.text = Score1.ToString():
textScore2.text = Score2.ToString();
}
4.最后到GameManager的Inspector面板内指定一下GUI Text组件
第十一课:添加音效
1.在主摄像机身上添加背景音乐,设置play on awake和Loop,volume设置为0.5
2.在player身上添加声音源组件,在player的脚本上添加一个碰撞函数OnCollisionEnter2D,设置碰撞游戏物体名字为Ball时播放音效
3.在Ball身上添加音频源组件,选择音频剪辑,设置为默认
4.在GameManager的碰撞函数中添加播放音效代码,当碰撞到UpWall或者RightWall时播放
第十二课:添加按钮重置功能
1.在Canvas下面添加一个名为ResetButton的Button按钮
2.在GameManager脚本中添加一个Reset的方法,回到Unity,添加一个按钮点击事件,选中GameManager下的Reset方法
3.分数可以直接在GameManager中重置,重置小球就要在BallMove添加一个重置的方法
4.具体代码为:
GameMnager:
public void Reset() {
score1 = 0;
score2 = 0;
textScore1.text = score1.ToString();
textScore2.text = score2.ToString();
GameObject.Find("Ball").SendMessage("BallReset");
}
BallMove:
void GoBall() {
int number = Random.Range(0,2);
if(number == 1){
rigidbody2d.AddForce(new Vector2(100,0));
}else{
rigidbody2d.AddForce(new Vector2(-100,0));
}
}
public void BallReset() {
transform.position = Vector2.zero;
GoBall();
}
5.重置功能成功实现
第十三课:发布游戏
1.发布游戏到PC端和Web端
网友评论