Unity初级案例 - 坦克大战 Day 1

1.课程内容总览

可以学到的知识:

1.Unity一些基础设置。
2.2D场景的搭建,预制体制作。
3.2D动画的制作。
4.图片图集的有关知识。
5.碰撞器,触发器,碰撞检测与触发检测。
6.2D游戏渲染的一些知识。
7.简单敌人AI的编写。
8.UGUI有关内容,场景切换等等。

2.工程创建,素材导入与介绍

3.场景搭建,素材的处理

4. 游戏中预制体的制作,2D动画的制作

5.控制玩家的移动

void Update () {
        float h = Input.GetAxisRaw("Horizontal");
        transform.Translate(Vector3.right * h * moveSpeed * Time.deltaTime, Space.World);
        float v = Input.GetAxisRaw("Vertical");
        transform.Translate(Vector3.up * v * moveSpeed * Time.deltaTime, Space.World);
    }

6.控制图片的移动切换

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour {

    public float moveSpeed = 3;
    public Sprite[] tankSprites;//上 右 下 左

    private SpriteRenderer sr;

    private void Awake()
    {
        sr = GetComponent<SpriteRenderer>();
    }

    // Update is called once per frame
    void Update () {
        float h = Input.GetAxisRaw("Horizontal");
        transform.Translate(Vector3.right * h * moveSpeed * Time.deltaTime, Space.World);
        if (h < 0)
        {
            sr.sprite = tankSprites[3];
        }else if (h > 0)
        {
            sr.sprite = tankSprites[1];
        }
        float v = Input.GetAxisRaw("Vertical");
        transform.Translate(Vector3.up * v * moveSpeed * Time.deltaTime, Space.World);
        if (v < 0)
        {
            sr.sprite = tankSprites[2];
        }
        else if (v > 0)
        {
            sr.sprite = tankSprites[0];
        }
    }
}

7.碰撞器的添加,解决抖动问题

给适当的物体添加boxcollider 2D.使用FixedUpdate来解决抖动问题

    private void FixedUpdate()
    {
        float h = Input.GetAxisRaw("Horizontal");
        transform.Translate(Vector3.right * h * moveSpeed * Time.fixedDeltaTime, Space.World);
        if (h < 0)
        {
            sr.sprite = tankSprites[3];
        }
        else if (h > 0)
        {
            sr.sprite = tankSprites[1];
        }
        float v = Input.GetAxisRaw("Vertical");
        transform.Translate(Vector3.up * v * moveSpeed * Time.fixedDeltaTime, Space.World);
        if (v < 0)
        {
            sr.sprite = tankSprites[2];
        }
        else if (v > 0)
        {
            sr.sprite = tankSprites[0];
        }
    }

8.移动优先级的添加,2D渲染层级问题

9.坦克的攻击方法

    //坦克的攻击方法
    private void Attack()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Instantiate(bulletPrefab, transform.position, transform.rotation);
        }
    }

10.子弹的朝向问题

    private Vector3 bulletEulerAngles;
    //坦克的攻击方法
    private void Attack()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            //子弹产生的角度:当前坦克的角度+子弹应该旋转的角度
            Instantiate(bulletPrefab, transform.position, Quaternion.Euler(transform.eulerAngles + bulletEulerAngles));
        }
    }

11.子弹朝向问题的解决,移动方法的编写

    //坦克的攻击方法
    private void Attack()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            //子弹产生的角度:当前坦克的角度+子弹应该旋转的角度
            if(sr.sprite == tankSprites[2])
            {
                bulletEulerAngles = new Vector3(0, 0, -180);
            }else if (sr.sprite == tankSprites[3])
            {
                bulletEulerAngles = new Vector3(0, 0, 90);
            }else if(sr.sprite == tankSprites[1])
            {
                bulletEulerAngles = new Vector3(0, 0, -90);
            }
                
            Instantiate(bulletPrefab, transform.position, Quaternion.Euler(transform.eulerAngles + bulletEulerAngles));
        }
    }

    //坦克的移动方法
    private void Move()
    {
        float v = Input.GetAxisRaw("Vertical");
        transform.Translate(Vector3.up * v * moveSpeed * Time.fixedDeltaTime, Space.World);
        if (v < 0)
        {
            sr.sprite = tankSprites[2];
            //bulletEulerAngles = new Vector3(0, 0, -180);
        }
        else if (v > 0)
        {
            sr.sprite = tankSprites[0];
         
        }

        if (v != 0)
        {
            return;
        }

        float h = Input.GetAxisRaw("Horizontal");
        transform.Translate(Vector3.right * h * moveSpeed * Time.fixedDeltaTime, Space.World);
        if (h < 0)
        {
            sr.sprite = tankSprites[3];
            //bulletEulerAngles = new Vector3(0, 0, 90);
        }
        else if (h > 0)
        {
            sr.sprite = tankSprites[1];
            //bulletEulerAngles = new Vector3(0, 0, -90);
        }
    }

12.攻击CD的加入,触发器与碰撞器的区别

    private float time = 0.4f;
    private float timer = 0;
    void Update () {
        if (timer >= time)
        {
            Attack();
            
        }
        else
        {
            timer += Time.deltaTime;
        }
        
    }

给子弹添加Box Collider2D和刚体组件,创建Bullet脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bullet : MonoBehaviour {

    public float moveSpeed = 10;

	// Update is called once per frame
	void Update () {
        transform.Translate(transform.up * moveSpeed * Time.deltaTime, Space.World);
	}

    private void OnTriggerEnter2D(Collider2D collision)
    {

    }
}

猜你喜欢

转载自blog.csdn.net/kouzhuanjing1849/article/details/84034402