码迷,mamicode.com
首页 > 编程语言 > 详细

unity官方教程Space Shooter 学习笔记

时间:2015-04-14 10:02:27      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:unity3d   太空射击   space shooter   官方教程   

我觉得这个教程对我最大的启发就是其中的一句话, 子物体是贴图,父物体是属性。所以我们在创建物体前最好先建立一个空的gameobject,

这样既可以保持hierarchy面板整洁便于管理,又能实现刚才说的话。好了, 下面步入正题。

如何创建一个子弹?

我们先创建一个平面,然后将子弹的贴图赋给这个平面,然后再将shader选项选中mobile的particles的additive,这样就只有激光那部分可以显示出来,

黑色部分就会小时,最后在给子弹添加rigidbody组件和capsule Collider组件,这样子弹就完成了。

如何让子弹前进?

直接在子弹z轴方向给一个初速度就好了

using UnityEngine;
using System.Collections;

public class BoltMove : MonoBehaviour {
	public float speed;
	// Use this for initialization
	void Start () {
		rigidbody.velocity = transform.forward * speed;
	}
}

让子弹按一定频率发射?

void Update(){
		//在固定的时间段生成一个物体
		if (Time.time > nextFire) {
			nextFire = Time.time + fireRate;
			Instantiate (shot, shotSpawn.position, shotSpawn.rotation);
		}
	}
shotSpwan.position是飞船的位置,fireRate就是我们想要的频率

何将飞船的移动限制在一定范围?

这里我们需要用到一个函数mathf中的Clamp

using UnityEngine;
using System.Collections;
[System.Serializable]
public class Limit{
	public float xMax,xMin,zMax,zMin;
}
public class PlayrControl : MonoBehaviour {
	public float speed;
	public Limit limit;
	public float tilt;
	public GameObject shot;
	public Transform shotSpawn;

	void FixedUpdate(){
		float x = Input.GetAxis ("Horizontal");
		float y = Input.GetAxis ("Vertical");
		Vector3 movement = new Vector3 (x, 0.0f, y);
		rigidbody.velocity = movement * speed;
		rigidbody.position = new Vector3
		(
			Mathf.Clamp(rigidbody.position.x, limit.xMin, limit.xMax),
			0.0f,
			Mathf.Clamp(rigidbody.position.z, limit.zMin, limit.zMax)
		);
		rigidbody.rotation = Quaternion.Euler (0.0f, 0.0f, rigidbody.velocity.x * -tilt);
	}
}
当子弹和陨石飞出边界时如何销毁?

这里我们需要一个大的Cube将我们游戏场景围起来,然后给Cube添加一个Box Collider组件,然后检测如果有物体离开触发器,销毁就好了

void OnTriggerExit(Collider other) {
		Destroy(other.gameObject);
	}

子弹与陨石碰撞或者飞船与陨石碰撞,如何同时销毁且产生爆炸效果?

void OnTriggerEnter(Collider other) {
		if (other.tag == "Boundary")
			return;
		hard++;
		if (hard == 2) {
			Instantiate (explosion, other.transform.position, other.transform.rotation);
			Destroy (gameObject);
			gameControl.AddScore(scoreValue);
		}
		if (other.tag == "Player") {
			Instantiate (player_explosion, other.transform.position, other.transform.rotation);
			Destroy (gameObject);
			gameControl.gameOver = true;
		}
		//Debug.Log (other.name);
			Destroy(other.gameObject);
	}
我解释一下, 
if (other.tag == "Boundary")
因为这个函数是当进入触发器时执行,但是我们的陨石一直在Cube的触发器中, 所以我们要排除Cube的干扰

Instantiate (explosion, other.transform.position, other.transform.rotation);
这句话就是在子弹当前位置产生一个爆炸效果物体


如何一波一波的生成敌人?

void Start(){
		StartCoroutine(SpawnWaves ());
	}
	IEnumerator SpawnWaves(){
		while (true) {
			yield return new WaitForSeconds (startWait);
			for (int i = 0; i < hazardCount; i++) {
				Vector3 spawnPositoin = new Vector3 (Random.Range (-spawnValues.x - 3, spawnValues.x - 3), 0, spawnValues.z);
				Quaternion spawnRotation = Quaternion.identity;
				Instantiate (hazard, spawnPositoin, spawnRotation);
				yield return new WaitForSeconds (spawnWait);
			}
		}
	}




unity官方教程Space Shooter 学习笔记

标签:unity3d   太空射击   space shooter   官方教程   

原文地址:http://blog.csdn.net/u013174702/article/details/45036933

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!