陨石
1.首先有三种陨石,每一种都添加刚体和碰撞框
2.把重力的√取消掉,并全部勾选isTrigger 用于后面的碰撞触发
如图:
此脚本挂在三个陨石预制体上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AsteroidCtr : MonoBehaviour {
// Use this for initialization
public float RotationSpeed; //定义陨石的旋转速度
public int Score;
public float MoveSpeed; //定义陨石的移动速度
public GameObject Boll;
private int _axis; //私有一个变量 用于下面三目运算符的判断
private Rigidbody _rig;
private CreateGameManagerCtr _createGameManager;
private AudioManagerCtr _audioManager;
private ScoreManager _scoreManager;
void Start ()
{
//从TagManager中找到 并得到脚本
_scoreManager = GameObject.FindWithTag(TagManager.ScoreManagerName).GetComponent<ScoreManager>();
_audioManager = GameObject.FindWithTag(TagManager.AudioManagerName).GetComponent<AudioManagerCtr>();
_createGameManager = GameObject.FindWithTag(TagManager.CreateManagerName).GetComponent<CreateGameManagerCtr>();
_rig = GetComponent<Rigidbody>();
if (null == _rig)
{
_rig = gameObject.AddComponent<Rigidbody>();
}
if (RotationSpeed == 0)
{
RotationSpeed = 250;
}
if (MoveSpeed == 0)
MoveSpeed = 6;
_rig.useGravity = false;
_rig.velocity = Vector3.back*MoveSpeed;
_axis = Random.Range(0, 2); //用于下面的三目运算符的判断
}
// Update is called once per frame
void Update () {
//三目运算符 如果_axis=0 绕X轴转 否则绕Z轴转
transform.RotateAround(transform.localPosition, (_axis == 0) ? transform.right : transform.forward, RotationSpeed * Time.deltaTime);
}
private void OnTriggerEnter(Collider other)
{
if(_createGameManager.PlayerOver)
return;
// 销毁对方
//销毁自己
//通知管理释放粒子特效
if (other.tag.Equals(TagManager.PlayBulletName)) //如果碰撞到自身的是玩家子弹
{
_createGameManager.CreateParticleByV3AndIndex(other.transform.position,2);//实例化爆炸特效
_audioManager.PlayAudio(3,AudioName.EnemyKill);//陨石爆炸音效
_scoreManager.AddScore(Score);//得分
Destroy(other.gameObject);//销毁子弹
Destroy(gameObject);//销毁陨石自身
if (Boll != null)
{
//实例化特效球
GameObject tmp = Instantiate(Boll, transform.position, Quaternion.identity);
Destroy(tmp,3); //3s钟后销毁特效球
}
}//PlyaerBulletEnd
if (other.tag.Equals(TagManager.PlayName)) //如果碰撞到自身的是玩家飞机
{
if (_createGameManager.PlayerIsProtected) //玩家飞机处于保护无敌状态
{
//则只销毁自身
_createGameManager.CreateParticleByV3AndIndex(other.transform.position, 2);
_audioManager.PlayAudio(3, AudioName.EnemyKill);
_scoreManager.AddScore(Score);
Destroy(gameObject);
if (Boll != null)
{
GameObject tmp = Instantiate(Boll, transform.position, Quaternion.identity);
Destroy(tmp, 3);
}
return;
}
//否则
//实例化粒子特效
_createGameManager.CreateParticleByV3AndIndex(other.transform.position, 2);
_createGameManager.CreateParticleByV3AndIndex(other.transform.position, 0);
//声音管理
_audioManager.PlayAudio(3, AudioName.EnemyKill);
_audioManager.PlayAudio(1, AudioName.PlyerKill);
//分数++
_scoreManager.AddScore(Score);
//玩家死亡
Destroy(other.gameObject);
Destroy(gameObject);
_audioManager.StopGame();
_createGameManager.StopGame();
_scoreManager.StopGame();
}
}
}
敌机的控制和碰撞脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyShipCtr : MonoBehaviour
{
public int Score;
public int MoveSpeed;
public GameObject EnemyBullet;
public float FireTime;
public Texture ChangeTexture;
public int Left; // -1 1
public GameObject Boll;
private CreateGameManagerCtr _createGameManager;
private AudioManagerCtr _audioManager;
private ScoreManager _scoreManager;
private Rigidbody _rig;
private int _bulletCount;
private float _timer;
void Start ()
{
_scoreManager = GameObject.FindWithTag(TagManager.ScoreManagerName).GetComponent<ScoreManager>();
_audioManager = GameObject.FindWithTag(TagManager.AudioManagerName).GetComponent<AudioManagerCtr>();
_createGameManager = GameObject.FindWithTag(TagManager.CreateManagerName).GetComponent<CreateGameManagerCtr>();
if (FireTime == 0)
{
FireTime = 0.8f;
}
transform.rotation = Quaternion.Euler(0,180,0); //让敌机旋转180 朝下飞
_rig = GetComponent<Rigidbody>();
if (_rig == null)
{
_rig = gameObject.AddComponent<Rigidbody>();
}
if (MoveSpeed == 0)
MoveSpeed = 5;
_rig.useGravity = false;
ChangeDir();
}
// Update is called once per frame
void Update ()
{
if(_createGameManager.PlayerOver)
return;
_timer += Time.deltaTime;
if(_timer >= FireTime)
{
_timer = 0;
_bulletCount++;
//实例化敌机子弹和音效
GameObject tmpGameObject = Instantiate(EnemyBullet, transform.Find("BulletPos").position, Quaternion.identity);
_audioManager.PlayAudio(2,AudioName.EnemyShipShoot);
tmpGameObject.GetComponent<EnemyBulletCtr>().MoveSpeed = Random.Range(8, 17); //敌机子弹速度
if (_bulletCount % 3 == 0) //敌机发射子弹 每第三发是一枚特殊子弹 不可被玩家子弹所抵消
{
//不能相互抵消
tmpGameObject.GetComponent<EnemyBulletCtr>().IsDes = false;
tmpGameObject.GetComponent<MeshRenderer>().material.mainTexture = ChangeTexture;
}
else
{
//抵消
tmpGameObject.GetComponent<EnemyBulletCtr>().IsDes = true;
}
}
}
private void ChangeDir()
{
//0 敌机往左边飘
//1 敌机不动垂直下落
//2 敌机往右边飘
//超出边界就直接反向
switch (Left)
{
case 0:
_rig.velocity = (transform.forward * MoveSpeed + transform.right * Random.Range(1, 4));
break;
case 1:
_rig.velocity = (transform.forward * MoveSpeed);
break;
case 2:
_rig.velocity = (transform.forward * MoveSpeed + -transform.right * Random.Range(1, 4));
break;
}
}
private void OnTriggerEnter(Collider other)
{
//敌人
if(_createGameManager.PlayerOver)
return;
//玩家
if (other.tag.Equals(TagManager.PlayName)) //与敌机自身碰撞的是玩家飞机
{
//玩家爆炸
if (_createGameManager.PlayerIsProtected) //如果玩家处于无敌保护状态
{
_createGameManager.CreateParticleByV3AndIndex(gameObject.transform.position, 1);
_audioManager.PlayAudio(2, AudioName.EnemyShipKill);
Destroy(gameObject);
_scoreManager.AddScore(Score);
if (Boll != null)
{
GameObject tmp = Instantiate(Boll, transform.position, Quaternion.identity);
Destroy(tmp, 3);
}
return;
}
// 否则
_createGameManager.CreateParticleByV3AndIndex(other.gameObject.transform.position, 0);
_createGameManager.CreateParticleByV3AndIndex(gameObject.transform.position, 1);
_audioManager.PlayAudio(1, AudioName.PlyerKill);
_audioManager.PlayAudio(2, AudioName.EnemyShipKill);
//音效
//互毁
Destroy(gameObject);
Destroy(other.gameObject);
_scoreManager.AddScore(Score);
//over
_createGameManager.StopGame();
_audioManager.StopGame();
_scoreManager.StopGame();
}//EndPlayer
if (other.tag.Equals(TagManager.PlayBulletName)) //如果与敌机碰撞的是玩家子弹
{
_createGameManager.CreateParticleByV3AndIndex(gameObject.transform.position, 1);
_audioManager.PlayAudio(2, AudioName.EnemyShipKill);
Destroy(gameObject);
Destroy(other.gameObject);
_scoreManager.AddScore(Score);
if (Boll != null)
{
//实例化特效球
GameObject tmp = Instantiate(Boll, transform.position, Quaternion.identity);
Destroy(tmp, 3); //3s钟后特效球消失
}
}//EndPlayBullet
}
void FixedUpdate() //用于物理更新
{
if (_rig.transform.position.x < -6.5) //设置左边边界 超出便反向
{
_rig.velocity = (transform.forward * MoveSpeed + -transform.right * Random.Range(1, 4));
}
if (_rig.transform.position.x > 6.5) //设置右边边界 超出便反向
{
_rig.velocity = (transform.forward * MoveSpeed + transform.right * Random.Range(1, 4));
}
}
}
敌机子弹脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyBulletCtr : MonoBehaviour {
public int MoveSpeed;
public bool IsDes;
private CreateGameManagerCtr _createGameManager;
private AudioManagerCtr _audioManager;
private ScoreManager _scoreManager;
private Rigidbody _rig;
void Start ()
{
//让子弹旋转90 能朝下飞
transform.rotation = Quaternion.Euler(90,0,0);
_scoreManager = GameObject.FindWithTag(TagManager.ScoreManagerName).GetComponent<ScoreManager>();
_audioManager = GameObject.FindWithTag(TagManager.AudioManagerName).GetComponent<AudioManagerCtr>();
_createGameManager = GameObject.FindWithTag(TagManager.CreateManagerName).GetComponent<CreateGameManagerCtr>();
_rig = GetComponent<Rigidbody>();
if (null == _rig)
{
_rig = gameObject.AddComponent<Rigidbody>();
}
if (MoveSpeed == 0)
MoveSpeed = 10;
_rig.useGravity = false;
_rig.velocity = transform.up * -MoveSpeed;
}
// Update is called once per frame
void Update () {
}
private void OnTriggerEnter(Collider other)
{
if (other.tag.Equals(TagManager.PlayName)) //如果与自身碰撞的是玩家
{
if (_createGameManager.PlayerIsProtected) //玩家处于无敌被保护状态
{
Destroy(gameObject); //只销毁敌机子弹自身
return;
}
//玩家爆炸
_createGameManager.CreateParticleByV3AndIndex(other.gameObject.transform.position,0);
_audioManager.PlayAudio(1,AudioName.PlyerKill);
//音效
//互毁
Destroy(gameObject);
Destroy(other.gameObject);
//over
_createGameManager.StopGame();
_audioManager.StopGame();
_scoreManager.StopGame();
}//EndPlayer
if (other.tag.Equals(TagManager.PlayBulletName)) //如果与敌机子弹碰撞的是玩家子弹
{
if (IsDes) //敌机子弹可以被抵消
{
Destroy(other.gameObject);
Destroy(gameObject);
}
else //敌机子弹不可被抵消
{
Destroy(other.gameObject);
}
}//EndPlayBullet
}
}