由于接着上次写比较麻烦,所以这次就把全部代码给大家。
使用c#和Unity 2018版。
下面是要用到的素材,把链接给大家:链接:https://pan.baidu.com/s/1oFXvnuIvdaB27Us_rPiLbg
提取码:n1fz
这个是一共得游戏物体和代码。
红色小鸟的代码和组件
public class Bird : MonoBehaviour {
private bool isClick = false ;
private float maxDis = 1.5f;
public SpringJoint2D Sj;//弹簧
protected Rigidbody2D Rb;
public LineRenderer right;//皮带
public Transform rightPos;
public LineRenderer left;
public Transform leftPos;
public GameObject boom;
protected TestMyTrail myTrail;
private bool canMove = true;
public float amooth = 3;
public AudioClip select;//音效
public AudioClip fly;
private bool isFly = false;
public Sprite hurt;
protected SpriteRenderer render;
void Start()
{
Sj = GetComponent<SpringJoint2D>();
Rb = GetComponent<Rigidbody2D>();
myTrail = GetComponent<TestMyTrail>();
render = GetComponent<SpriteRenderer>();
}
// Use this for initialization
private void OnMouseDown()
{
if (canMove)
{
Audioplay(select);
isClick = true;
Rb.isKinematic = true;
}
}
private void OnMouseUp()
{
if (canMove)
{
isClick = false;
Rb.isKinematic = false;
Invoke("Fly", 0.1f);
right.enabled = false;
left.enabled = false;
canMove = false;
}
}
// Update is called once per frame
void Update ()
{
if (isClick)
{
transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
transform.position += new Vector3(0,0, -Camera.main.transform.position.z);
if (Vector3.Distance(transform.position,rightPos.position) > maxDis)
{
Vector3 pos = (transform.position - rightPos.position).normalized;
pos *= maxDis;
transform.position = pos + rightPos.position;
}
Line();
}
//相机跟随
float posX = transform.position.x;
Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position, new Vector3(Mathf.Clamp(posX, 0, 10), Camera.main.transform.position.y, Camera.main.transform.position.z),amooth * Time.deltaTime);
if (isFly)
{
if (Input.GetMouseButtonDown(0))
{
ShowSkill();
}
}
}
void Line()
{
right.enabled = true;
left.enabled = true;
right.SetPosition(0, rightPos.position);
right.SetPosition(1, transform.position);
left.SetPosition(0, leftPos.position);
left.SetPosition(1, transform.position);
}
void Fly()
{
isFly = true;
Audioplay(fly);
myTrail.sRrail();
Sj.enabled = false;
Invoke("Next", 5);
}
protected virtual void Next() {
GameManager._isstance.birds.Remove(this);
Destroy(gameObject);
Instantiate(boom, transform.position, Quaternion.identity);
GameManager._isstance.NextBird();
}
private void OnCollisionEnter2D(Collision2D collision)
{
isFly = false;
myTrail.cTrail();
}
public void Audioplay(AudioClip clip)
{
AudioSource.PlayClipAtPoint(clip, transform.position);
}
/// <summary>
/// 炫技飞行
/// </summary>
public virtual void ShowSkill()
{
isFly = false;
}
public void Hurt()
{
render.sprite = hurt;
}
}
组件
小猪和木块的代码和组件
public class Pig : MonoBehaviour {
public int MaxSpeed = 10;
public int MinSpeed = 5;
private SpriteRenderer render;
public Sprite hurt;
public GameObject boom;
public GameObject score;
public bool _isPig;
public AudioClip hurtClip;
public AudioClip dead;
public AudioClip birdCollision;
// Use this for initialization
void Start () {
render = GetComponent<SpriteRenderer>();
}
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "Player")
{
Audioplay(birdCollision);
//collision.transform.GetComponent<Bird>().Hurt();
}
if (collision.relativeVelocity.magnitude > MaxSpeed)
{
Dead();
}
else if (collision.relativeVelocity.magnitude > MinSpeed && collision.relativeVelocity.magnitude < MaxSpeed)
{
render.sprite = hurt;
Audioplay(hurtClip);
}
}
public void Dead()
{
if (_isPig)
{
GameManager._isstance.pigs.Remove(this);
}
Destroy(gameObject);
Instantiate(boom, transform.position, Quaternion.identity);
GameObject go = Instantiate(score, transform.position + new Vector3(0,0.5f,0), Quaternion.identity);
Destroy(go, 1.5f);
//播放音乐
Audioplay(dead);
}
public void Audioplay(AudioClip clip)
{
AudioSource.PlayClipAtPoint(clip, transform.position);
}
// Update is called once per frame
void Update () {
}
}
组件
这里代码挂载上物体有一个isPig,是小猪打上对勾,其他的就不打对勾了
游戏流程GameManager代码和组件
public class GameManager : MonoBehaviour {
public List<Bird> birds;
public List<Pig> pigs;
private Vector3 originPos;
public static GameManager _isstance;
public GameObject win;
public GameObject lose;
public GameObject[] stars;
// Use this for initialization
void Start () {
_isstance = this;
Initialized();
if (birds.Count > 0)
{
originPos = birds[0].transform.position;
}
}
public void Initialized()
{
for (int i = 0; i < birds.Count; i++)
{
if (i == 0)
{
birds[i].transform.position = originPos;
birds[i].enabled = true;
birds[i].Sj.enabled = true;
}
else
{
birds[i].enabled = false ;
birds[i].Sj.enabled = false ;
}
}
}
public void NextBird()
{
if (pigs.Count >0)
{
if (birds.Count > 0)
{
Initialized();
}
else
{
lose.SetActive(true);
}
}
else
{
win.SetActive(true);
ShowStars();
//赢
}
}
public void ShowStars()
{
StartCoroutine("show");
}
IEnumerator show()
{
for (int i = 0; i < birds.Count + 1; i++)
{
yield return new WaitForSeconds(0.2f);
stars[i].SetActive(true);
}
}
public void Replay ()
{
SceneManager.LoadScene(1);
}
public void Home()
{
SceneManager.LoadScene(0);
}
// Update is called once per frame
void Update () {
}
}
组件
设置尾拖代码和组件
public class TestMyTrail : MonoBehaviour
{
public WeaponTrail myTrail;
private float t = 0.033f;
private float tempT = 0;
private float animationIncrement = 0.003f;
void Start()
{
// 默认没有拖尾效果
myTrail.SetTime(0.0f, 0.0f, 1.0f);
}
public void sRrail()
{
//设置拖尾时长
myTrail.SetTime(2.0f, 0.0f, 1.0f);
//开始进行拖尾
myTrail.StartTrail(0.5f, 0.4f);
}
public void cTrail()
{
//清除拖尾
myTrail.ClearTrail();
}
void LateUpdate()
{
t = Mathf.Clamp(Time.deltaTime, 0, 0.066f);
if (t > 0)
{
while (tempT < t)
{
tempT += animationIncrement;
if (myTrail.time > 0)
{
myTrail.Itterate(Time.time - t + tempT);
}
else
{
myTrail.ClearTrail();
}
}
tempT -= t;
if (myTrail.time > 0)
{
myTrail.UpdateTrail(Time.time, t);
}
}
}
}
组件
黄色小鸟的代码和组件
public class yellowBird : Bird {
/// <summary>
/// 重写方法
/// </summary>
public override void ShowSkill()
{
base.ShowSkill();
Rb.velocity *= 2;
}
}
采用继承和重写红色小鸟里的方法
组件
绿色小鸟代码和组件
public class GreenBird : Bird {
public override void ShowSkill()
{
base.ShowSkill();
Vector3 speed = Rb.velocity;
speed.x *= -1;//将x变为相反数
Rb.velocity = speed;
}
}
同样用继承和重写
组件
黑色小鸟代码和组件
public class BlackBird : Bird {
public List<Pig> blocks = new List<Pig>();
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.tag == "Enemy")
{
blocks.Add(collision.gameObject.GetComponent<Pig>());
}
}
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.gameObject.tag == "Enemy")
{
blocks.Remove(collision.gameObject.GetComponent<Pig>());
}
}
public override void ShowSkill()
{
base.ShowSkill();
if (blocks.Count > 0 && blocks != null)
{
for (int i = 0; i < blocks.Count; i++)
{
blocks[i].Dead();
}
}
OnClear();
}
void OnClear()
{
Rb.velocity = Vector3.zero;
Instantiate(boom, transform.position, Quaternion.identity);
render.enabled = false;
GetComponent<CircleCollider2D>().enabled = false;
myTrail.cTrail();
}
protected override void Next()
{
GameManager._isstance.birds.Remove(this);
base.Next();
GameManager._isstance.NextBird();
}
}
继承和重写
组件
精灵死亡的爆炸代码
public class boom : MonoBehaviour {
public void Boom()
{
Destroy(gameObject);
}
}
这个是另一个代码
public class Lose : MonoBehaviour {
// Use this for initialization
public void Show()
{
GameManager._isstance.ShowStars();
}
}
背景移动代码
public class Move : MonoBehaviour {
void Update () {
transform.Translate(Vector3.left* Time.deltaTime * 100);
if (transform.position.x <= 100)
{
transform.position = new Vector2(600,170);
}
}
}
暂停动画代码
public class pausePanel : MonoBehaviour {
private Animator anim;
public GameObject button;
//public GameObject resur;
//public GameObject pauses;
// Use this for initialization
void Start () {
anim = GetComponent<Animator>();
}
public void Retry()
{
Time.timeScale = 1;
UnityEngine.SceneManagement.SceneManager.LoadScene(1);
}
/// <summary>
/// 点击了pause按钮
/// </summary>
public void Pause()
{
anim.SetBool("isPause", true);
button.SetActive(false);
}
/// <summary>
/// 点击了继续按钮
/// </summary>
public void Resume()
{
Time.timeScale = 1;
anim.SetBool("isPause", false);
}
public void Home()
{
Time.timeScale = 1;
UnityEngine.SceneManagement.SceneManager.LoadScene(0);
}
/// <summary>
/// pause动画播放完调用
/// </summary>
public void PauseAnimeEnd()
{
Time.timeScale = 0;
}
/// <summary>
/// resume动画播放完调用
/// </summary>
public void ResumeAnimEnd()
{
button.SetActive(true);
}
// Update is called once per frame
void Update () {
}
}
切换场景代码
public class Skip : MonoBehaviour {
// Use this for initialization
void Start () {
this.GetComponent<Button>().onClick.AddListener(OnClicke);
}
void OnClicke() {
SceneManager.LoadScene("Game");
}
// Update is called once per frame
void Update () {
}
}
代码就这么多,还有需要完善的地方。
后续会出动画怎么做。
第一节:https://blog.csdn.net/m0_47605113/article/details/109216649
愤怒小鸟(1.5):
https://blog.csdn.net/m0_47605113/article/details/109379611
总代码链接:https://blog.csdn.net/m0_47605113/article/details/109441671
望大家捧场,多多支持。感谢