最近做了一个小游戏,一个简单的平台跑酷,简单记一个DevLog。
初步框架
搭建环境
我下载了一个Unity3D做这个项目。应该说,Unity 3D做起来还是蛮简单的,容易上手。
这里呢送上链接:
https://unity3d.com/get-unity/download
点右边这个按钮就可以了,等下载好,打开后按照指引安装Unity Hub,不会英语的可以直接一路Continue(不过建议别装到系统盘),完了以后运行Unity Hub,在Hub里找到最新版的Unity Editor,等个大概半个小时就装好了。
角色行为构建
这个游戏是2D平台游戏,所以就直接在2D core的基础上创建就行。先把游戏的主要内容创建好。
做一个最简单的地图,只需要满足移动和跳跃的需求就可以了。给地图的平台贴上标签“Platform”,给出口贴上标签“Finish”。插入2D -> Sprite -> Capsule 创建一个胶囊体,就是玩家了。把上述的所有对象添加碰撞箱,玩家还要有刚体组件。接下来就是写代码了。
在Assets下Create -> Folder 命名为Script,点进去,Create -> C# script,命名为PlayerBehaviour,用VS打开。
先声明一些与角色能力有关的量,比如移动速度,跳跃速度(离地时的垂直速度),见下:
然后在Update里调用Input.GetKeyDown或者Input.GetKey获取按键,区别是前者是当按下按键的瞬间(准确来说是按下按键时所在的帧中)是true,然后就是false;后者只要当前按键是被按下的,就是true。然后根据按键给刚体赋予相应的速度。
看一下这部分的代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerBehaviour : MonoBehaviour
{
// 这部分代码是声明一些变量,在这里省略
void Start()
{
// get rigid body
rb = gameObject.GetComponent<Rigidbody2D>();
// constant settings
initSpeed = 5f;
initJumpSpeed = 7.5f;
// initialize variables
jumpSpeed = initJumpSpeed;
speed = initSpeed;
}
void Update()
{
// velocity settings
vx = rb.velocity.x;
vy = rb.velocity.y;
// running
if (Input.GetKey(KeyCode.D))
{
vx = speed;
ModifyScale(true);
}
else if (Input.GetKey(KeyCode.A))
{
vx = -speed;
ModifyScale(false);
}
else
{
vx = 0;
}
// press A and D at the same time make it stop
if (Input.GetKey(KeyCode.D) && Input.GetKey(KeyCode.A))
{
vx = 0;
}
// jumping
if (Input.GetKeyDown(KeyCode.W))
{
vy = jumpSpeed;
}
// position changing
rb.velocity = new Vector2(vx, vy);
}
}
然后给玩家添加一个Trail Renderer,给角色添加轨迹。本来准备弄个白色半透明的尾迹的,没想无心插柳,现在成了这个样子(我觉得可能是因为没有加载透明通道,但是既然都成这样了,就不要动它了)。
做个地图,把玩家贴图稍微美化一下。
来,上图:
然后允许一下二段跳,跳跃时增加一个变量1,当这个变量等于2时,就不允许再跳跃,落地就把这个数字调回0。
进阶特性
死亡判定
判定方式就是创建OnCollisionEnter方法,给尖刺和岩浆什么的赋予标签。碰撞的时候接受一个参数,回调的时候这个参数会被传入,我们就从这个传回的参数获取到另外一个gameObject的tag属性。当这个tag是“Spike”,“Lava”的时候就判定为死亡,重新加载场景。这样也可以实现上述的落地把跳跃次数调回0。贴代码:
// ...
public class PlayerBehaviour : MonoBehaviour
{
// ...
void respawn()
{
transform.position = new Vector3(respawnX, respawnY, 0);
// added in v0.0.2, reload level after dying
GameManage.changeScene(this.gameObject.scene.name);
}
// die function
void die(string tag){
// tag是用作粒子特效的不同的判定
// Please add particle effect here!
respawn();
}
void OnCollisionEnter2D(Collision2D collision)
{
for (int i = 0; i < NearButton.Length; i++)
{
NearButton[i] = false;
}
var colliderTag = collision.collider.tag;
if (colliderTag=="Lava")
{
die(colliderTag);
}
else if (colliderTag=="Platform")
{
jumpNum = 0;
}
else if (colliderTag=="Spike")
{
die(colliderTag);
}
else if (colliderTag=="Finish")
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
}
// ...
}
}
buff加成
创建一些道具,吃到以后就可以有一些buff加成,比如跑得更快,跳得更高,乃至无视重力。与此相关的是按下按钮开启的门。
由于部分原因,这部分代码写的跟屎一样,就没有脸贴出来了。