unity愤怒的小鸟初级版的实现

1,304 阅读2分钟

这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战

之前已经写过几篇用unity写的小游戏博客,感觉还不错,那么我就继续写下去。 今天写的愤怒的小鸟初级版本。

愤怒的小鸟曾经是风靡全球的游戏,在玩法上就是用小鸟通过弹簧来射击猪。其中猪是由各种东西保护的。游戏规则也相对来说比较简单。

老规矩,先上效果图

image.png

场景比较简单,背景图是一个蓝色,然后中间摆放了各种物品,其实物体是用手工在前期就已经摆好的,所以这里面就不多说什么。直接进入主题,看代码。

 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的话,可以关注公众号:诗一样的代码,留言给我,我教你系统地学。