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

制作于2017年12月23日

价格 免费

x轴:vector3.right

y轴:vector3.up

float h = Input.GetAxis("Horizontal");
transform.Translate(Vector3.right * h * moveSpeed * Time.deltaTime, Space.World);
//三维向量,方向×按键输入×移动速度×按时间运动(每秒10米而不是每桢10米),空间为整个空间。


float v = Input.GetAxis("Vertical");
transform.Translate(Vector3.up * v * moveSpeed * Time.deltaTime, Space.World);
//三维向量,方向×按键输入×移动速度×按时间运动,空间为整个空间。

 

[展开全文]

判断位置列表是否包含位置可以使用 List 的Contains 方法,用于判断列表中是否包含某个元素。

        while (true)
        {
            Vector3 createPostion = new Vector3(Random.Range(-9, 10), Random.Range(-7, 8), 0);
            if (!itemPositionList.Contains(createPostion))
            {
                return createPostion;
            }
        }

 

[展开全文]

为什么刚体要添加在运动的物体上面
为什么触发器要双方都带有触发器的才能正常工作
translate中的世界坐标系与self坐标系的区别

[展开全文]

其实在一开始控制坦克的朝向那里,不使用替换的方式而是直接改变坦克本身朝向的话,这里就可以直接 transform.rotation 而不需要再去+子弹应该旋转的角度了。

[展开全文]

坦克移动控制代码优化,原先的有个奇怪的问题,按住W或者S的时候没法左右移动,因为 v != 0 被 return 掉了。

    public float speed = 3;    
    private List<string> codelist = new List<string>();
    private string lastKeyCode = string.Empty;    

    // Update is called once per frame
    void Update()
    {
        SetLastKeyCode();
    }

    private void FixedUpdate()
    {
        PlayerMove();
    }

    private void PlayerMove()
    {
        Vector3 vector = new Vector3();
        Quaternion quaternion = new Quaternion();

        switch (lastKeyCode)
        {
            case "W":
                vector = new Vector3(0, speed * Time.deltaTime, 0);
                quaternion = Quaternion.Euler(0.0f, 0.0f, 0.0f);
                break;
            case "S":
                vector = new Vector3(0, -speed * Time.deltaTime, 0);
                quaternion = Quaternion.Euler(0.0f, 0.0f, 180.0f);
                break;
            case "A":
                vector = new Vector3(-speed * Time.deltaTime, 0, 0);
                quaternion = Quaternion.Euler(0.0f, 0.0f, 90.0f);
                break;
            case "D":
                vector = new Vector3(speed * Time.deltaTime, 0, 0);
                quaternion = Quaternion.Euler(0.0f, 0.0f, -90.0f);
                break;
            default:
                vector = new Vector3(); break;
        }

        if (lastKeyCode != "")
        {
            //设置坦克的朝向
            transform.rotation = quaternion;
            //设置坦克的位置
            transform.Translate(vector, Space.World);
        }
    }

    #region SetLastKeyCode
    private void SetLastKeyCode()
    {
        #region KeyDown
        if (Input.GetKeyDown(KeyCode.W)) { MoveKeyDown("W"); }
        if (Input.GetKeyDown(KeyCode.S)) { MoveKeyDown("S"); }
        if (Input.GetKeyDown(KeyCode.A)) { MoveKeyDown("A"); }
        if (Input.GetKeyDown(KeyCode.D)) { MoveKeyDown("D"); }
        #endregion

        #region KeyUp
        if (Input.GetKeyUp(KeyCode.W)) { MoveKeyUp("W"); }
        if (Input.GetKeyUp(KeyCode.S)) { MoveKeyUp("S"); }
        if (Input.GetKeyUp(KeyCode.A)) { MoveKeyUp("A"); }
        if (Input.GetKeyUp(KeyCode.D)) { MoveKeyUp("D"); }
        #endregion
    }

    private void MoveKeyDown(string keyCode)
    {
        if (!codelist.Contains(keyCode))
        {
            codelist.Add(keyCode);
        }

        if (codelist.Count > 0)
        {
            var key = codelist[codelist.Count - 1];
            lastKeyCode = key;
        }
    }

    private void MoveKeyUp(string keyCode)
    {
        codelist.RemoveAll(key => key.Contains(keyCode));
        if (codelist.Count > 0)
        {
            var key = codelist[codelist.Count - 1];
            lastKeyCode = key;
        }
        else
        {
            lastKeyCode = string.Empty;
        }
    }
    #endregion

 

[展开全文]

本章AI人工智能:并非AI,而是随机数

[展开全文]

1. 通过Sprite Renderer组件中的Sorting Layer可以和Order in Layer调整物体的层级;order值越高越后渲染,越优先显示

[展开全文]

1. 发生碰撞的条件:两者身上都有碰撞器,且至少一者身上有刚体

 

2. 刚体一般添加给运动的一方,因为物体物体长时间不运动时,其刚体组件会休眠,导致无法发生碰撞检测

 

3.  生命周期函数 FixedUpdate(),再Update()之后执行

 

4.  FixedUpdate()和Update()说明:

     ①FixedUpdate():固定物理帧,每帧大小一致;物体受力不变,碰撞时不会发生抖动

     ②Update()每帧大小不一致,且因设备而异;物体受力发生改变,碰撞时会发生抖动 

[展开全文]

06:30,想起了siki老师讲的枚举类型了

[展开全文]

此处没有禁用v和h监听按键的语句

[展开全文]

v、h的控设置优先级,如果没有输入就return

先处理V纵向输入,如果有输入的话(!=0),就不再处理下面的H横向输入,直接return掉

[展开全文]

动画制作小技巧:

选中project面板中需要做成动画的全部图片,然后拖入Hiearchy面板,会自动生成动画(三角形图标的是动画,四个小方块的是动画控制器)

[展开全文]

一、背景设置:

camare-background——黑色

比例——5:4

size——8.5

以上数值可以自己调试

Windows-console

二、素材处理:

Texture Type——调为Sprite(2D and UI)

Sprite Mode:单张图single,图集multiple

三、切割图片

sprite editor-slice-Type{自动、以格子尺寸切割,以格子行量切割}

小窍门:一开始调节方格的大小到合适的尺寸,随后选择以格子尺寸切割

四、保存场景,整理文件夹

 

[展开全文]

欧拉角转四元数:

Quaternion.Euler();

[展开全文]

single 处理单张图片

multipie 处理多张小图

[展开全文]

Destroy(gameObject,float time);多久消亡物体对象.

[展开全文]

transform.Translate(Vector*Time.deltaTime,Space.world)

如果是物体本身自转,就必须填世界坐标第二个参数?????

 

用世界坐标发现不对,然后用Space.seft发现就正常了,是我一开始prefabs设置有问题吗

 

刚体RigidBody

[展开全文]