unity打箱子小游戏demo

制作一个小的打箱子的demo来验收一下之前学习过的内容,主要的功能包括有自动生成一系列箱子、用户以第一人称发射小球子弹击打放置在平面上的箱子。

箱子的生成

将箱子作为prefabs通过脚本自动生成,相关代码如下:

//用箱子生成一堵墙
public GameObject Wall;

void Start()
{
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            GameObject box_instance = Instantiate(Wall);
            box_instance.transform.position = new Vector3(-4, (float)0.5 + i, 0+j); 
        }
    }
}

主要在Start方法中在游戏刚开始便生成一堵5*5箱子组成的墙,通过Instantiate来自动生成相应的prefabs实例。

unity打箱子小游戏demo_第1张图片

这部分的效果如图。由于希望箱子在被小球击中后有碰撞反馈,会掉下平面,因此还需要给生成的箱子设置刚体组件。

子弹小球的生成

子弹小球也将其作为prefabs来通过代码生成,希望按下鼠标左键便会生成小球,小球会沿着鼠标指向的方向获得一个速度,通过调用bullet的刚体组件的velocity可以给它赋予速度。速度的方向为:

hit.point - Camera.main.transform.position

其中hit为射线碰到物体的另一端点。

同时由于在一些fps游戏中都会有枪管冷却时间,因此可以通过设置frozenTime来控制小球发射的速度。

这部分的完整代码如下:

public class CreateBoxDemo : MonoBehaviour
{
    //用箱子生成一堵墙
    public GameObject Wall;

    //子弹对象
    public GameObject Bullet;

    //cursor的2D纹理
    public Texture2D cursor;

    //冷却时间
    private float frozeTime;
    //冷却时间计时
    private float frozeTimeCountDown;


    // Start is called before the first frame update
    void Start()
    {
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                GameObject box_instance = Instantiate(Wall);
                box_instance.transform.position = new Vector3(-4, (float)0.5 + i, 0+j); 
            }
        }

        frozeTime = 0.2f;
        frozeTimeCountDown = 0;

        Cursor.SetCursor(cursor, new Vector2(cursor.width / 2, cursor.height / 2), CursorMode.Auto);    //设置光标为瞄准十字效果
    }

    // Update is called once per frame
    void Update()
    {
        frozeTimeCountDown += Time.deltaTime;
        //如果按下鼠标左键
        if (Input.GetMouseButtonDown(0)) {
            //每一秒发出一个子弹
            if (frozeTimeCountDown >= frozeTime) {
                frozeTimeCountDown = 0f;
                RaycastHit hit;
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                if (Physics.Raycast(ray, out hit, 50f)) {
                    var bullet = Instantiate(Bullet);
                    bullet.GetComponent().velocity = (hit.point - Camera.main.transform.position) * 5;
                    
                }
            }

        }
    }
}

unity打箱子小游戏demo_第2张图片

生成效果如图。

消失在视野中的gameobject的释放

对于一些已经消失在主相机的视野之外的游戏物体,应当对其进行释放,以节约计算机资源。

编写一个新的脚本作为两个prefabs的属性脚本,调用OnBecameInvisible方法接受相关消息。

//当物体消失在视野中触发
void OnBecameInvisible()
{
    Destroy(gameObject);
}

你可能感兴趣的:(Unity笔记)