c#和unity开发愤怒的小鸟(2)

由于接着上次写比较麻烦,所以这次就把全部代码给大家。
使用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
望大家捧场,多多支持。感谢

猜你喜欢

转载自blog.csdn.net/m0_47605113/article/details/109441671