这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战
之前已经写过几篇用unity写的小游戏博客,感觉还不错,那么我就继续写下去。 今天写的愤怒的小鸟初级版本。
愤怒的小鸟曾经是风靡全球的游戏,在玩法上就是用小鸟通过弹簧来射击猪。其中猪是由各种东西保护的。游戏规则也相对来说比较简单。
老规矩,先上效果图
场景比较简单,背景图是一个蓝色,然后中间摆放了各种物品,其实物体是用手工在前期就已经摆好的,所以这里面就不多说什么。直接进入主题,看代码。
public float forceNeeded = 1000;
float collisionForce(Collision2D coll) {
// Estimate a collision's force (speed * mass)
float speed = coll.relativeVelocity.sqrMagnitude;
if (coll.collider.GetComponent<Rigidbody2D>())
return speed * coll.collider.GetComponent<Rigidbody2D>().mass;
return speed;
}
void OnCollisionEnter2D(Collision2D coll) {
if (collisionForce(coll) >= forceNeeded)
Destroy(gameObject);
}
}
上面这部分代码是挂在猪的身上的,其实就是碰撞力大于预定的数值,这样才能让猪消灭。Destroy(gameObject)就是把猪消灭。猪没有额外的其他逻辑代码。
public GameObject effect;
void OnCollisionEnter2D(Collision2D coll) {
// Spawn Effect, then remove Script
Instantiate(effect, transform.position, Quaternion.identity);
Destroy(this);
}
这个是碰撞到之后就自己被消灭,然后再释放特效,这个是冰的脚本。也是没有太多的逻辑在。
void OnMouseUp() {
// Disable isKinematic
GetComponent<Rigidbody2D>().isKinematic = false;
// Add the Force
Vector2 dir = startPos - (Vector2)transform.position;
GetComponent<Rigidbody2D>().AddForce(dir * force);
// Remove the Script (not the gameObject)
Destroy(this);
}
void OnMouseDrag() {
// Convert mouse position to world position
Vector2 p = Camera.main.ScreenToWorldPoint(Input.mousePosition);
// Keep it in a certain radius
float radius = 1.8f;
Vector2 dir = p - startPos;
if (dir.sqrMagnitude > radius)
dir = dir.normalized * radius;
// Set the Position
transform.position = startPos + dir;
}
整份代码,应该最重要这一部分,这是写了弹叉的功能。包括了鼠标点击之下进行拖拽,然后再鼠标按键松开的效果。拖拽的功能用记录鼠标位置,拖动小鸟的位置。然后鼠标松开函数实现了计算发射方向和给小鸟增加一个力的过程。
这个是一个比较基础简单的游戏实例,有兴趣学unity的话,可以关注公众号:诗一样的代码,留言给我,我教你系统地学。