学习笔记
第一步 我们先把场景搭好,同时准备好游戏中的物体:玩家,子弹,方块,墙。
这就是我们的场景了。
这就当作是我们的子弹了。
第二步 我们写脚本控制玩家移动,同时要控制玩家移动范围:只能左右移动,且不超出墙。
public class PlayerMove : MonoBehaviour {
float h;
public Transform left;
public Transform right;
void Start()
{
}
// Update is called once per frame
void Update()
{
h = Input.GetAxis("Horizontal");
transform.Translate(transform.right * h * 5 * Time.deltaTime);
}
private void OnCollisionEnter(Collision collision)
{
if (collision.collider.name == "Left")
{
transform.position = new Vector3(transform.position.x + 1f, transform.position.y, transform.position.z);
}
if (collision.collider.name == "Right")
{
transform.position = new Vector3(transform.position.x -1f, transform.position.y, transform.position.z);
}
}
}
第三步 我们写子弹的发射脚本:向上发射,同时要控制摧毁子弹如果碰到物体后以及自然消失,并且如果子弹击中了方块,我们要统计击中的次数。
public class Fire : MonoBehaviour {
public GameObject player;
public GameObject shell;
Vector3 shellPos;
// Use this for initialization
void Start() {
}
// Update is called once per frame
void Update() {
shellPos = new Vector3(player.transform.position.x,player.transform.position.y+0.2f,player.transform.position.z);
if (Input.GetMouseButtonDown(0))
{
Instantiate(shell, shellPos, player.transform.rotation);
}
}
}
public class Shell : MonoBehaviour
{
public Rigidbody shellRid;
[HideInInspector]
public static int count = 0;
[Range(1, 10f)]
public int speed = 5;
// Use this for initialization
void Start()
{
StartCoroutine(destroy());
}
// Update is called once per frame
void Update()
{
shellRid.velocity = transform.up * speed;
}
IEnumerator destroy()
{
yield return new WaitForSeconds(1.5f);
Destroy(gameObject);
}
private void OnCollisionEnter(Collision collision)
{
if (collision.collider.name == "Cube")
{
Destroy(gameObject);
count++;
//Debug.Log(count);
}
Destroy(gameObject, 0.01f);
}
}
第四步 我们把方块的刚体加上,同时要使用重力,还要使z值相同,落下去后要复位。
public class EqualPosZ : MonoBehaviour {
public Transform player;
Vector3 pos;
// Use this for initialization
void Start()
{
pos = player.position;
transform.position = new Vector3(transform.position.x, transform.position.y, pos.z);
}
}
public class Reset : MonoBehaviour {
Vector3 oldPos;
Quaternion rota;
public GameObject cube;
public Transform player;
public Rigidbody rid;
// Use this for initialization
void Start()
{
oldPos = cube.transform.position;
rota = cube.transform.rotation;
}
// Update is called once per frame
void Update()
{
if (Vector3.Distance(gameObject.transform.position, player.position) > 20f)
{
cube.transform.position = oldPos;
cube.transform.rotation = rota;
rid.velocity = new Vector3(0, 0, 0);
}
}
}
第五步 我们把ui显示脚本写上,显示击中次数,倒计时(倒计时到游戏结束),以及得分。
public class UI : MonoBehaviour {
public Text countText;
public Text scoreText;
public Text timeText;
[Range(60, 90)]
public int totalTime = 60;
int oldTime;
// Use this for initialization
void Start () {
StartCoroutine(time());
oldTime = totalTime;
}
// Update is called once per frame
void Update () {
countText.text = "击中目标" + Shell.count.ToString() + "次";
scoreText.text = "现在得分为" + Shell.count * (oldTime - totalTime);
timeText.text = totalTime.ToString();
}
IEnumerator time()
{
while (totalTime > 0) {
yield return new WaitForSeconds(1f);
totalTime--;
}
}
}