做一個打磚塊的遊戲,最終的結果是如下圖所示
這個遊戲很簡單,主要就是利用了Unity3d的實體引擎,有興趣的朋友可以先自己做一下,遊戲雖然簡單,但我中間遇到很多坑,看看有沒有人能一下做好。
一、建立四個面cube
這個注意
(1) 不要設定剛體(RigidBody屬性,這個屬性會導緻剛體之間的碰撞)
二、設定四個面Materials為彈性材料,全反射
定義好材質Material為彈性材料 Assets->右鍵->Create->Physic Meterial
屬性設定如下:
Bounciness=1 按照我的了解就是籃球自由落體到地面的會彈高度,如果是1就是和原來一樣高。
Friction是摩擦力,這裡都設為0
三、小球的材料以及其他的磚塊的材料也使用上面定義的材質。
Box Collider裡面設定的是碰撞的彈性材質
RigidBody裡面的Mass是品質的意思,原來的數值是1,這裡改成100000,不然後面會遇到小球碰撞多次後,速度會逐漸慢下來的效果。這個原因我找了很久。
其原因是碰撞後,磚塊就會有一點速度,這個速度就來自于小球,是以小球會越來越慢。
磚塊設定好以後,拖入Assets中變成預制體(prefabs)
四、建立剛體小球
屬性如下圖所示
主要就是彈性材質
然後編寫初始化小球的代碼,主要就是給小球增加一個初始的力
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InitBall : MonoBehaviour
{
private Rigidbody rbody;
public float x ;
public float y ;
// Start is called before the first frame update
void Start()
{
rbody = GetComponent<Rigidbody>();
Vector3 force = new Vector3(x, y, 0);
rbody.AddForce(force);
}
// Update is called once per frame
void Update()
{
}
}
x,y需要在小球屬性那裡初始化
五、初始化場景,自動生成磚塊的位置,使用預制體prefabs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InitScene : MonoBehaviour
{
public GameObject obj; //傳入的預設
// Use this for initialization
void Start()
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 8; j++)
{
Vector3 vec = new Vector3(i * (float)1.5, 3 - j * (float)1.1, 0);
//參數一:是預設 參數二:執行個體化預設的坐标 參數三:執行個體化預設的旋轉角度
GameObject instance = (GameObject)Instantiate(obj, vec, transform.rotation);
instance.GetComponent<Renderer>().material.color = RandomColor();
//這裡 transform.position,transform.rotation分别代表的是相機和坐标和 旋轉角度
}
}
}
public Color RandomColor()
{ //r、g、b分别随機從0-1之間取值
float r = Random.Range(0f, 1f);
float g = Random.Range(0f, 1f);
float b = Random.Range(0f, 1f);
//執行個體化一個color,并把r,g,b傳進去
Color color = new Color(r, g, b);
//傳回一個color值
return color;
}
// Update is called once per frame
void Update()
{
}
}
這個代碼可以拖入到Main Camera中,一啟動就會被執行
六、檢測碰撞和計分,這個代碼也要加到磚塊預制體上面
右鍵可以直接建立UI->Text,自己調整坐标到遊戲界面上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class brick : MonoBehaviour
{
private static int score = 0;
private void OnCollisionEnter(Collision other)
{
GameObject TextObj = GameObject.Find("Canvas/Text");
if (TextObj != null)
{
Text obj = TextObj.GetComponent<Text>();
obj.text = "Score:" + ++score;
Debug.Log("score is"+score);
}
Destroy(gameObject);
}
}
有問題可以加QQ群交流 824815540