本期内容–前端开发
继上期搭建好plasticSCM后。
在转到前端开发之前,小组成员已经完成了第一个游戏的部分开发。素材是Q版风格。类型类似于“向下100层”的玩法。特别限制了游戏空间,并不是很大的空间以及各种机关营造了一种紧张的感觉。
本期正式开发–完善了第一个游戏的内容和玩法。
并且在制作完成一个小功能后测试plasticSCM的优越性。测试与小组另一个开发者的协同版本控制。
工作具体实现
bgm及音效
bgm及音效是游戏趣味性的一大影响因素。
针对第一款游戏类型的紧张和Q版风格的素材,特别选择了一款有节奏的并且欢快的bgm。
导弹制作。
想法:
导弹水平发射,在期间击中玩家则玩家死亡。
出现前相应的位置会出现红色警戒线以及在导弹发射处进行UI警告。
这个图中的导弹是在提示后已经发射出的导弹。
而那条红色警戒线和左边的警告标识则是代表即将从左边发射一个导弹。
为了增加难度可以设定为红线消失一秒后再发射导弹,这就考验玩家的记忆能力和协调能力了。
导弹脚本
,其中start方法可能比较乱。
其意思差不多就是在生成导弹时,start方法会初始化导弹的发射方向(随机)、警告线、警告标识、警告音频等。
当触碰到玩家时会发生位移(移出)屏幕外,其实是因为当时碰撞音频是由这个脚本播放的,若立即销毁导弹则会导致音频消失。
这个地方应该由玩家或专门的音效系统(后续文章可能会出现)负责,就不会出现这么尴尬和笨拙的代码了0.0
关键代码
public class bombScript : MonoBehaviour
{
//音频
AudioSource audioSource;
public AudioClip flyClip;
//两个预设及实例
public GameObject warningSprite;
public GameObject warningLine;
GameObject sprite;
GameObject line;
//参数
float speed = 10;
int direction;//0是从右往左
float countTime = 0;
float height;
// Start is called before the first frame update
void Start()
{
audioSource = GetComponent<AudioSource>();
audioSource.clip = flyClip;
audioSource.PlayDelayed(3);
//导弹方向、位置
direction = Random.Range(0, 2);
transform.localScale = new Vector3(-1, transform.localScale.y);
if (direction == 0)//0代表向左
{
//spriteRenderer = GetComponent<SpriteRenderer>();
//spriteRenderer.flipX = true;//反向
transform.localScale = new Vector3(1, transform.localScale.y);
direction = -1;
}
height = Random.Range(-6f, 5f);
transform.position = new Vector2(-5.5f * direction, height);
//显示位置提示
sprite = Instantiate(warningSprite, new Vector3(-4.2f * direction, height), Quaternion.identity);
AudioSource spriteSource = sprite.GetComponent<AudioSource>();
spriteSource.Play();
//显示警告线
line = Instantiate(warningLine, new Vector3(0, height), Quaternion.identity);
}
// Update is called once per frame
void Update()
{
countTime += Time.deltaTime;
//计时之后fly并飞行,2秒前显示,3秒发射,5秒摧毁
if (countTime >= 4)
{
Destroy(gameObject);
}
else if (countTime >= 3)
{
//根据direction发生位移
//transform.position += new Vector3(direction * speed * Time.deltaTime, 2.5f * Time.deltaTime);//y相对平台保持静止
transform.position += new Vector3(direction * speed * Time.deltaTime, 0);//y相对相机保持静止
}
else if (countTime >= 2)
{
Destroy(sprite);
Destroy(line);
}
else
{
sprite.transform.localScale = new Vector3(Mathf.Abs(1 - countTime) * 0.1f + 0.1f, Mathf.Abs(1 - countTime) * 0.1f + 0.1f, 0);
}
}
private void OnTriggerEnter2D(Collider2D other)//触发器*********************************可能有bug,碰到平台会消失onCollosionEnter2D??
{
if (other.gameObject.CompareTag("Player"))
{
AudioManager.instance.Bomb();
Destroy(gameObject);
}
}
}
另外别忘了在延迟x时间后销毁警告线和标识。unity提供了具有延迟功能的api。具体不多说啦。
消失砖块的制作。
众多游戏中可能都包含一个“松动”的砖块。
这个不例外,具有同样功能,基本上站几秒就会消失并且伴随打破砖块的声音。
这里面也是因为音频的尴尬原因,(移出屏幕外或者关闭渲染及碰撞)延时销毁。
关键脚本
public class BreakStone : MonoBehaviour
{
AudioSource breakAudioSource;
public AudioClip breakClip;
float countTime = 0, endTime = 1;
bool start = false;
// Update is called once per frame
void Update()
{
if(start)
{
countTime += Time.deltaTime;
}
if(countTime>=endTime+1)
{
Destroy(gameObject);
}
if (countTime >= endTime)
{
transform.position = new Vector3(0, -20);
}
}
public void OnCollisionEnter2D(Collision2D collision)
{
if (collision.collider.gameObject.tag.Equals("Player"))
{
breakAudioSource = GetComponent<AudioSource>();
breakAudioSource.clip = breakClip;
breakAudioSource.PlayDelayed(1);
start = true;
}
}
}
总结
创建新的unity项目,并托管到plasticSCM。然后把已经完成的项目转移到新项目上。
读前端已经开发的代码,熟悉开发思路和代码结构。
增加新的游戏机制–导弹、会破碎的平台砖块,,,不过出现了尴尬的音频问题与销毁问题。
熟悉plasticSCM的使用。