26507人加入学习
(150人评价)
Unity2D 初级案例 - 坦克大战(Unity2017.1)

制作于2017年12月23日

价格 免费

把场景UI都放在一个空物体下即可通过该物体控制整体移动

作业一    移动界面动画

作业二    双人游戏

Editor project settings Input 右键复制

作业三    红色坦克奖励  时钟 停止运动

在敌人脚本中设置一个bool值 return

堡垒  wall 变障碍  把wall销毁重新创建一个障碍

设置一个计时器

炸弹 消灭场内所有敌人 定义一个列表 把敌人的gameobject 存进去 再遍历删除

帽子 重新激活无敌特效与bool值

作业四 给tank履带做动画 加一个动画控制器Animator

[展开全文]

# 项目问题
1. 2D建议Game面板5:4比例,摄像头距离为8.5。

2. 移动:
    - 获取水平垂直输入:

    ```c#
    float h = Input.GetAxisRaw("Horizontal");
    float v = Input.GetAxisRaw("Vertical");
    ```
    - 移动:

    ```c#
    transform.Translate(Vector3.right * h  * moveSpeed * Time.deltaTime, Space.World);
    transform.Translate(Vector3.up * v  * moveSpeed * Time.deltaTime, Space.World);
    ```
    
    - ==Time.deltaTime: 每一帧所花费的时间==

3. 获取组件GetComponent<>();
    - 获取图片渲染:

    ```c#
    private SpriteRenderer sr; 
    sr = GetComponent<SpriteRenderer>(); 
    赋值 sr.sprite = sprite
    ```

4. 添加刚体之后的元素在移动时候,出现抖动现象应该从Update移动到FixUpdate中执行(deltaTime 要改为 fixedDeltaTime)。

5. 监听键盘鼠标输入:

    ```c#
    Input.GetKeyDown(KeyCode.Space)
    Input.GetKeyUp(KeyCode.A)
    ```

6. 实例化物体 Instantiate(物体, 位置, 角度(四元数))

    ```c#
    public GameObject bulletPrefab;
    GameObject bullet = Instantiate(bulletPrefab, transform.position, transform.rotation);
    ```

7. 欧拉角(x、y、z),四元数(向量)
    - 欧拉角转换为四元数
        
    ```
        Quaternion rotation = Quaternion.Euler(0, 30, 0);
    ```
    - Vector3 是欧拉角
    
    ```
    Vector3 rotationVector = new Vector3(0, 30, 0);
    ```

8. transform.up 和 Vector3.up (Space.World)
    - transform.up 是相对于自身移动,移动方向不一定为(0,1,0),但是模长一定是1.
    - Vector3.up 相对于世界坐标移动,移动方向一定是(0,1,0)

9. 2D碰撞检测(触发):OnTriggerEnter2D()
    
    ```
        private void OnTriggerEnter2D(Collider2D collision)
        {
            print(collision.tag);
            print(collision.name);
        }
    ```
    - collision 被碰撞物体信息
    - ==collision.SendMessage("Die"); 触发被碰撞物体内部方法==
    
10. 设置物体激活状态: SetActive(状态)

    ```
    public GameObject bulletPrefab;
    bulletPrefab.SetActive(true);
    bulletPrefab.SetActive(false);
    ```
    - SetActive(true); 设置物体启用
    - SetActive(false); 设置物体禁用
    
11. 延时调用方法:Invoke(方法名, 延时时间秒)

    ```
    Invoke("PlayerBorn", 0.8f);
    private void PlayerBorn()
    {
        Instantiate(playerPrefab, transform.position, transform.rotation);
    }
    ```
    
12. 重复调用方法:InvokeRepeating(方法名,多少秒之后立即调用,每隔多少秒调用一次)
    
13. 随机数(包左不包右):Random.Range(0, 1)
14. Quaternion.identity: 无旋转即:Quaternion(0,0,0,0)
15. SetParent: 设置父物体

    ```
        GameObject gb = Instantiate(createGameObject, position, rotation);
        gb.transform.SetParent(gameObject.transform);
    ```
    
16. 单例模式:

    在使用 Unity 开发游戏的时候,经常会需要各种 Manager 类用于管理一些全局的变量和方法,例如最常见的 GameManager 用于记录各种需要在整个游戏过程中持久化的数据。本文以 GameManager 为例,假设我们有以下几个需求:
    
    - 整个游戏过程中必须有且只有一个 GameManager
    - 在 GameManager 里会记录一个叫 Value 的整型变量
    - 切换游戏场景的时候 GameManager 不能被销毁
    - 有两个游戏场景分别叫 FirstScene 和 SecondScene
    - 每一个场景中都会有一个按钮,点击后会跳转到另一场景,并且对 GameManager.Value 进行 +1 操作
    - 每一个场景中都会显示当前 GameManager.Value 的值
    
    ```
    public class GameManager : MonoBehaviour
    {
        public static GameManager Instance { get; private set; }
        public int Value { get; set; } = 0;
     
        private void Awake()
        {
            Instance = this;
        }
    }
    ```

17. 声音播放:
    
    - AudioSource.PlayClipAtPoint()

    ```
        public AudioClip barriarAudio; // 获取声音资源
        AudioSource.PlayClipAtPoint(barriarAudio, transform.position); // 播放(静态方法)
    ```
    - AudioSource 和 AudioClip
        - AudioSource 是声音控制
        - AudioClip 是声音资源
        
        ```
            public AudioSource moveAudio;
            public AudioClip[] tankAudio;
            if (!moveAudio.isPlaying)
            {
                moveAudio.clip = tankAudio[1];
                moveAudio.Play();
            }
        ```
        - moveAudio.Play() 播放
        - moveAudio.clip 设置声音资源
        - moveAudio.volume = 0.5f; 声音大小0-1

[展开全文]

edit->project setting->input:修改属性

[展开全文]

授课教师

SiKi学院老师

课程特色

图文(2)
视频(31)
下载资料(1)