Fire Balls 11——修正遊戲的BUG

版權申明:

  • 本文原創首發於如下網站:
  1. 博客園『優夢創客』的空間:https://www.cnblogs.com/raymondking123
  2. 優夢創客的官方博客:https://91make.top
  3. 優夢創客的遊戲講堂:https://91make.ke.qq.com
  4. 『優夢創客』的微信公衆號:umaketop
  • 您能夠自由轉載,但必須加入完整的版權聲明

目標

  • Tower的Cylinder的放大,防止先打到磚塊
  • 場景的調色
  • 命中後子彈消失
  • Tank的調整
  • 磚塊淡出禁用碰撞體
  • Tower沒有上升完畢禁止射擊

Tower的Cylinder的放大

  • 把咱們的Cylinder放大至合適的大小(比磚塊大一些)便可;

場景的調色

  • 首先在咱們的場景上找到太陽光(Directional Light)並把顏色參數設置爲以下所示:

命中後子彈消失

  • 打開咱們的Projectile腳本,找到碰撞發生函數,並添加以下代碼
private void OnCollisionEnter(Collision collision)
    {
        if(collision.gameObject.tag == "Tower")
        {
            Destroy(gameObject);
            collision.transform.parent.GetComponent<Tower>().DropTower();
        }
        if(collision.gameObject.tag == "Arch")
        {
            lober.endPos = player.transform.position;

            lober.enabled = true;

            player.gameover = true;

            Destroy(gameObject, 1.5f);
        }
    }

Tank的調整

  • 打開咱們的Level1預製體找到咱們的Tank把Tank拖到Level1的子節點,也就是和平臺是同一節點便可

磚塊淡出禁用碰撞體

  • 首先打開咱們的方塊預製體和圓柱預製體把裏面的碰撞體Collider都更改成MeshCollider。
  • 打開咱們的Bricks腳本找到setFadeout函數添加以下代碼便可:
internal void setFadeout()
    {
        isFadeout = true;

        GetComponent<MeshCollider>().enabled = false;
    }

Tower沒有上升完畢禁止射擊

  • 打開Tank腳本增長一個Bool變量名爲isMovingUp而後在Update函數裏編寫以下代碼
void Update()
    {
        if (gameover)
            return;
        if (Input.GetButtonDown("Fire1"))
        {
            pressTime = Time.time;
        }
        if (isMovingUp)
            return;
        if (Input.GetButton("Fire1")&&Time.time - lastFireTime>0.2f)
        {
            //每一幀計算當前時間-按下時間之差d
            float d = Time.time - pressTime;
            //實例化一個子彈;
            var transProj = Instantiate(Bullet).transform;

            float f = d / 2;//最大2秒內有變化,超過2秒使用最高音高係數(1)
            if (f > 1)
            {
                f = 1;
            }

            transProj.GetComponent<AudioSource>().pitch = 1 + f * 2;
            //設置子彈的父節點;
            transProj.SetParent(transform, false);
            //設置子彈的座標;
            transProj.position = ShotPos.position;
            //給子彈一個力,能夠讓子彈往前移動;
            Vector3 v = ShotPos.forward * 20;           
            transProj.GetComponent<Rigidbody>().AddForce(v, ForceMode.Impulse);
            lastFireTime = Time.time;   
           
        }
    }
  • 打開咱們的Tower腳本編寫以下代碼便可。
public class Tower : MonoBehaviour
{
    public int Height;
    public Color[] Colors = new Color[2];
    public GameObject brickPrefab;
    public List<GameObject> bricks = new List<GameObject>();
    public bool isRisenUp = false;//磚塊是否是所有從地下鑽上來了
    public Tank tank;
    // Start is called before the first frame update
    void Start()
    {
        tank = GameObject.Find("Player").GetComponent<Tank>();
        for(int i = 0; i < Height; i++)
        {
            GameObject goBrick = Instantiate(brickPrefab);
            goBrick.transform.SetParent(transform,false );
            goBrick.transform.Translate(0, i, 0,Space.Self);
            goBrick.GetComponent<MeshRenderer>().material.color = Colors[i % 2];
            goBrick.transform.Rotate(0, i*10, 0,Space.Self);
            bricks.Add(goBrick);
        }
        StartCoroutine(RiseUpFormUnderground());
    }
    IEnumerator RiseUpFormUnderground()
    {
        transform.Translate(0, -Height * transform.lossyScale.y, 0, Space.Self);
        while (transform.position.y<0.8*transform.lossyScale.y)
        {
            transform.Translate(0, 5 * Time.deltaTime, 0, Space.Self);
            yield return null;
        }
        isRisenUp = true;
		
        tank.isMovingUp = false;
    }

    // Update is called once per frame
    
    

    
}
相關文章
相關標籤/搜索