本人为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文件。
到此,本项目全部结束。初次制作文章,有很多不足,望大家指正和包含。