Unity小游戏--见缝插针(含登录界面) 北京联合大学校选课程期末项目(版本5.4)

        本人为BUUer,在校选课Unity游戏开发入门课程中,浅薄的学习了相关知识。当我进行期末项目开发和报告撰写的时候,发现有关我们学习的Unity版本,网上可以查阅的资料并不算多,更发现了很多未被解答的问题。为此,我发出自己的期末Unity项目来以我个人的视角进行一些肤浅的制作流程介绍及解释。

       

         我所制作的小游戏为见缝插针(2d游戏),主要旨在实现登录、交互、及游戏功能。为避免涉及素材问题,介绍中全部使用纯色块。该版本并非本人的期末时完成的版本,相较之下该版本更优秀。

        本程序将游戏拆分成3个界面:登录、交互、游戏。以方便理解,界面间皆由botton跳转进行连接。 脚本均为C# script文件。

 3个界面,就需要有3个unity文件。点击左上角File,点击创建新界面(New scene) Ctrl+S保存会弹出位置和命名(本人此处命名为:登录界面main,交互界面other,游戏界面game)

再点击File中的Build Settings

将这三个unity文件全部勾选,然后退出该界面,开始正式编辑。

         登录界面

大致布局如下 

进入main,首先更改摄像头

然后使用自己设置一个背景,及在Canvas下建一个Image,Image重命名为Back ground,然后将贴图拖入,再通过一定大小修改即可(本人使用为1280X720的图片)

此时效果应为

在Back ground下再次使用Image重命名为IFID,在IFID下添加3个Text,依次重命名为TitleID,Placeholder,Text

 

重命名后

TitleID在白色框左侧

Placeholder在白框内 颜色为灰(50,50,50,128)

 

Text不做改动 

之后在IFID上添加Input Field组件(Add Component)

 将IFID下的Text拖入Text Component栏中,若Target Graphic为空则将IFID拖入

然后复制IFID在Back ground下粘贴,将所有的ID改为PW

另一个Placeholder

 TitlePW

注意检查IFPW的Input Field组件中的Text Component挂的是Text否为IFPW下的Text

此时效果如下

在Back ground下接着新建Text,重命名为Error,位于PW的下面,下图为其内容,颜色为红

然后隐藏Error

 继续在Back ground下添加Button,重命名为Submit,可以加入贴图

Button下会自带一个Text,在Text中编辑

此时效果如下


 

 在这个界面中需要两个C# script文件

 一个为储存账户密码的Data文件,另一个是Submit上的认证并跳转界面的SubmitEvent文件

Data 文件代码:

using UnityEngine;
using System.Collections;

public class Data {
	public static string[][] ACCOUNT = new string[1][] {
		//string后面第一个[]控制账户密码的个数
        new string[]{ "abc", "123" },
		//{}内前为ID后为PW

	};
}

SubmitEvent 文件代码:

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.Collections;

public class SubmitEvent : MonoBehaviour {
	public InputField IFID;
	public InputField IFPW;
	public Text error;

	public void Submit(){
		string userID = IFID.text;
		string userPW = IFPW.text;
		if (error.gameObject.activeSelf) {
			error.gameObject.SetActive (false);
		}
		if (string.IsNullOrEmpty (userID) || string.IsNullOrEmpty (userPW)) {
			error.text = "Can't empty of account or password!!";
			error.gameObject.SetActive (true);
			return;
		}
		bool isSuccess = false;
		for (int i = 0; i < Data.ACCOUNT.Length; ++i) {
			string dataID = Data.ACCOUNT [i] [0];
			string dataPW = Data.ACCOUNT [i] [1];
			if (dataID.Equals (userID) && dataPW.Equals (userPW)) {
				isSuccess = true;
				break;
			}

		}
		if (isSuccess) {
            //跳转至交互界面,""内为文件名
			SceneManager.LoadScene ("other");
		} else {
			error.text = "Account or password error,please try again!!";
			error.gameObject.SetActive (true);
			return;
		}
	}


}

将SubmitEvent 文件挂在Submit上,然后按如下样式添加

然后添加Submit的click on,将Submit自己拖入,然后功能选择为:SubmitEvent.Submit()

 

尝试运行,无问题则登录界面部分已完成(ID与PW都输入正确的情况下应该跳转至交互界面,此处展示为Error部分无误)

        交互界面

大致布局如下

在Canvas下创建一个Image,拖动大小与相机范围相等。Image重命名为background,继续在background下创建两个Button,分别命名为start和quit。名为start的位置在上,名为quit的位置在下,此时布局如下

对于start:

       

start下Text编辑:

然后start上添加脚本into

into:

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.Collections;

public class into: MonoBehaviour {
	public void ChangeScene(){
		SceneManager.LoadScene("game");
        //跳转至下一场景""内为场景名


	}

}

添加点击(click on)将自己拖入,功能选择into.ChangeScene()

 对于quit:

quit下Text编辑:

然后quit上添加脚本quit

quit:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class quit : MonoBehaviour
{
	
	public void Close()
	{
		Application.Quit();
        //退出进程,只能在exe文件中体现,预览下无反应,效果类似于Alt+F4
	}
}

添加点击(click on)将自己拖入,功能选择quit.Close()

此时效果如下

 尝试运行,无问题则交互界面部分已完成

        游戏界面

        界面内由几个部分组成:旋转的靶、向靶飞的针、生出针的点、返回交互界面的按钮以及游戏是否失败的判定。需要准备一个圆形和一个长方形的素材

大致布局如下

在Main Camera中设置Skybox并修改背景颜色

    

将圆拖入项目命名为Spin在通过通过修改达到如下效果(Flip X Y勾选),位置不可太高,太高可能导致针显示不下

创建一个2D object重命名为Target将位置与Spin重合然后将Spin拖入到Target下,务必保证Target的scale为(1,1,1)可以防止针的贴图因为并入为Spin子项时针贴图按Spin的scale比例变化而导致的系列问题(针作为Target的子项与Spin是并列关系)

 

然后为Target添加脚本Spin

using UnityEngine;
using System.Collections;
public class Spin : MonoBehaviour {
	public float speed = 170f;
    //定义速度
	void Update () {
		transform.Rotate (0, 0, speed * Time.deltaTime);
	}
}

将圆再次拖入命名为Pin,再将矩形拖入到Pin下,也命名为Pin。并调整至如下效果

给圆形Pin添加脚本Pin

using UnityEngine;
using System.Collections;
public class Pin : MonoBehaviour {
	private Rigidbody2D pin;
	public float speed = 70f;
    //定义速度
	void Start () {
        //钢体组件调用
		pin = GetComponent<Rigidbody2D>();
		//向靶飞
        pin.velocity =Vector2.up*speed;
	}
	void Update () {
	}
	void OnTriggerEnter2D(Collider2D col){
        //碰撞体调用
        //碰撞的条件判定
		if (col.tag == "Target") {
			pin.velocity = Vector2.zero;
			transform.SetParent (col.transform);//Pin(clone)成为Target下子项
			Score.scoreValue++;//计数
		}
        //因为该项目中仅存在针和靶两个碰撞体所以else可行
        //防止出现判定时因为Pin丢失导致失败不执行
		else {
            //调用GameOver文件
			GameObject.FindObjectOfType<GameOver> ().GameOver();
		}

	}
}

针和靶的组件添加

        Target中添加Circle Collider2D(圆形碰撞组件),圆Pin添加Circle Collider2D、Box Collider2D(矩形碰撞组件)和Rigidbody2D,其中Rigidbody2D的重力参数为零即Gravity Scale为0,所有的Collider2D勾选Is Trigger,然后碰撞体调整至如下效果(PS:针的圆碰撞与圆形贴合即可矩形碰撞大致为针柄的一半或更短,是为了保障连发时不出现针之间的误碰而导致直接判定为失败,同时也保障了靶下针柄相互碰撞导致判定为失败。圆碰撞体和矩形碰撞体最好存在缝隙,防止出现头与柄误碰直接判定为失败。因为针碰撞体积小于针贴图体积,所以靶的圆碰撞体要大于它本身,在视觉上保障针插的不是很深。)

计分

在Canvas下添加Text,重命名为Score,调整文本位置于靶内,然后Canvas挂脚本Score

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class Score : MonoBehaviour {
	public static int scoreValue;
	public Text scoreText;
	void Start () {
		scoreValue = 0;
	}
	void Update () {
		scoreText.text = scoreValue.ToString ();
		}
}

然后将Score拖入进Score Text内

编辑Score:

此时布局如下 

此时运行可能会有GM的报错,可以先注掉然后再运行。若针固定在靶上随靶转动,计数从0变1且不随靶转动,则代码正确。

 针的出生点

先将Pin拖入Assets来作为预制件,然后将文件内的Pin重命名为PIN_spawerpoint,将七挂载的Circle Collider2D、Box Collider2D、Rigidbody2D和Pin脚本都删除。

给PIN_spawerpoint新加脚本Spawner

using UnityEngine;
using System.Collections;
public class Spawner : MonoBehaviour {
	public GameObject pinFrefab;
	void Start () {
	}
	void Update () {
        //按空格键执行,因为还有按钮为不冲突才使用空格
        //无按钮可改"Fire1"
		if (Input.GetKeyDown ("space")) {
			SpawnPin ();
		}
	}
	void SpawnPin(){
        //调用一个Pin(clone)
		Instantiate (pinFrefab, transform.position, transform.rotation);
	}
}

然后将Pin拖进Spawner的Pin Prefab

接下来,将PIN_spawerpoint和Spin都拖进Assets作为预制件,防止出现Object丢失的警告。

试运行,若出生点处针贴图不消失,针中靶则计数,则代码正确

游戏失败

在Main Camera中添加脚本Gameover

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
public class Gameover : MonoBehaviour {
	private Camera MainCamera;
	private bool isGameOver = false;//bool函数
	public Spawner spawner;//出生点调用
	public Spin spin;//靶调用
	public float timer=0f;
	public Score scoreText;//计分调用
	void Start () {
	}
	public void GameOver(){
		if (!isGameOver) {
			isGameOver = true;
			spawner.enabled = false;//出生点停止
			spin.enabled = false;//靶停止
			scoreText.enabled = false;//计分停止
            //更改相机背景颜色
			MainCamera = Camera.main;
			MainCamera.backgroundColor = Color.Lerp (MainCamera.backgroundColor, Color.gray,50f);
			}
	}
}


将PIN_spawerpoint、Spin、Canvas分别拖入Spawner、Spin、Score Text

运行正常则无问题(失败演示)

在Canvas下添加Button,命名为return

Text如下

return添加脚本goout

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
public class goout : MonoBehaviour {
		public void ChangeScene(){
		SceneManager.LoadScene("other");//返回交互界面
		}
}

添加点击(click on)将自己拖入,功能选择goout.ChangeScene()

此时布局如下

所有项目部分到此结束。点击File中的Build Settings,选择游玩端口,点击Build,选择路径。完成后将会获得一个exe文件和对应Data文件。

         到此,本项目全部结束。初次制作文章,有很多不足,望大家指正和包含。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值