首先创建一个3D项目,并给项目起一个名字

 在已有的资源包中导入Tank资源

 选中my Assets

 之后创建一个3D平面

 创建一个材质文件包将3D面板设置为绿色

 拖拽  坦克预制体,之后完全解压缩,起名为Tank,将Tank内部摄像机拿出去

 在Assets下创建script文件夹

创建脚本名为TankTeam,再创建一个预制体文件夹

清除Tank身上多余组件

将Tank移除多余子组件

 再将Tank放置预制体文件夹后 删除

将TankTeam代码放置主摄像机,并将Tank预制体填充代码对象

需求一:每按一次空格,坦克顺序缩小0.5倍 任务完成运行结果为,

 将主摄像机TankTeam脚本移除,开始下个任务

需求二:每按一次空格,坦克阵列顺序开炮

 找到资源文件夹中的bullets

 将GB_piercer...导弹拖拽至场景中

 然后将预制体完全解压缩

将导弹身上自带脚本移除掉

 然后将导弹改名为Rocket

 在做所有运动物体之前,都需要看一下世界坐标与实际坐标是否在同一个位置

 

 并且确定z轴坐标与y坐标是否朝前,因为要控制移动

 

 检查标准后

放到预制体文件夹中待用

 之后将原对象删除

 将Tank预制体拽到场景中

 点击Tank对象右侧小箭头进入预制体空间

 接下来我们要创建一个导弹发射点

改名为FirePos

 将FirePos放在导弹下作为子物体

移除掉FirePos身上的碰撞器

 将FirePos调小至0.5

将FirePos放置导弹尖部

 调至小球z轴方向与火箭发射同向,首先将全局坐标改为局部坐标

然后调至旋转角度

 

 在script文件包里创建一个Tank脚本,目的在坦克上发射导弹

 之后将Tank脚本挂在Tank对象身上

进入rocket预制体将rocket,调成使用重力Use Gravity,及关闭is Trigger 

 在Tank脚本下复制以下代码

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

public class Tank : MonoBehaviour
{
    public GameObject rocketObj;   //导弹
    public Transform firePos;   //发射点物体位置
    private void Start()
    {
        if (rocketObj == null || firePos == null)
            Debug.LogError("请将导弹预制体或发射点拽入参数栏");
    }
    private void Update()
    {
        if (Input.GetKeyUp(KeyCode.Space))
        { 
            GameObject rocket = Instantiate(rocketObj,firePos.position,firePos.rotation);
            rocket.GetComponent<Rigidbody>().AddForce(transform.forward  * 1000f);
        }
    }
}
而后将 需求一的缩小代码注释掉

注释// 掉  tankArray[row, col].transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);

回到Tank代码注释掉

添加以下代码

public void ShootFire()
    { 
        //实例化导弹
        GameObject rocket = Instantiate(rocketObj,firePos.position,firePos.rotation);
        //给导弹添加一个力
        rocket.GetComponent<Rigidbody>().AddForce(transform.forward * 1000f);
    }

 再将TankTeam代码改写成

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

public class TankTeam : MonoBehaviour
{
    public GameObject tankPrefab;   //坦克预制体
    GameObject[,] tankArray;   //坦克二维数组
    public int row, col;   //行列变量
    private void Start()
    {
        if (tankPrefab == null)
            Debug.LogError("请将坦克预制体带入参数栏");
        tankArray = new GameObject[3,4];
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                GameObject tank = Instantiate(tankPrefab, new Vector3(i * 2f, 0.42f, j * 2f),Quaternion.identity);
                tankArray[i, j] = tank;   //将坦克引用保存到二维数组中
            }
        }
    }
    private void Update()
    {
        
        if (Input.GetKeyUp(KeyCode.Space))
        {
            //需求一:每按一次空格键,坦克顺序缩小0.5倍
            //tankArray[row, col].transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
            if (++col > 3)
            {
                col = 0;
                row++;
            }
            if (row > 2)
                row = 0;
            //需求二:每按一次空格键,坦克顺序开炮
            tankArray[row,col].GetComponent<Tank>().ShootFire();
        }
    }
}
 

 而后删除场景中的坦克与导弹

需求二:坦克每按一次空格,导弹按顺序发射任务完成,如果想把按空格改成点击发射则可修改代码

 

 如果想连续发射,则修改

 需求二(完善):如果后面的坦克能打到前面坦克,则可以给导弹施加一个向上的力,代码修改如下

最后将主摄像机身上的Tank脚本对勾取消

 

即完成需求二:每按一次空格,Tank按顺序开炮

 接下来我们完成需求三:每按一次空格,坦克按行顺序开炮

将TankTeam代码替换

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

public class TankTeam : MonoBehaviour
{
    public GameObject tankPrefab;   //坦克预制体
    GameObject[,] tankArray;   //坦克二维数组
    public int row, col;   //行列变量
    private void Start()
    {
        if (tankPrefab == null)
            Debug.LogError("请将坦克预制体带入参数栏");
        tankArray = new GameObject[3,4];
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                GameObject tank = Instantiate(tankPrefab, new Vector3(i * 2f, 0.42f, j * 2f),Quaternion.identity);
                tankArray[i, j] = tank;   //将坦克引用保存到二维数组中
            }
        }
    }
    private void Update()
    {
        
        if (Input.GetKeyUp(KeyCode.Space))
        {
            //需求一:每按一次空格键,坦克顺序缩小0.5倍
            //tankArray[row, col].transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
            if (++col > 3)
            {
                col = 0;
                row++;
            }
            if (row > 2)
                row = 0;
            //需求二:每按一次空格键,坦克顺序开炮
            //tankArray[row,col].GetComponent<Tank>().ShootFire();
            //需求三:每按一次空格,坦克按行顺序开炮
            if (Input.GetMouseButtonUp(0))
            {
                for (int col = 0; col < 4; col++)
                {
                    tankArray[row, col].GetComponent<Tank>().ShootFire();
                }
                if(++row > 2)
                    row = 0;
            }
        }
    }
}

需求三完成;

需求四:每按一次空格,坦克按列顺序发射

将以下代码替换

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

public class TankTeam : MonoBehaviour
{
    public GameObject tankPrefab;   //坦克预制体
    GameObject[,] tankArray;   //坦克二维数组
    public int row, col;   //行列变量
    private void Start()
    {
        if (tankPrefab == null)
            Debug.LogError("请将坦克预制体带入参数栏");
        tankArray = new GameObject[3,4];
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                GameObject tank = Instantiate(tankPrefab, new Vector3(i * 2f, 0.42f, j * 2f),Quaternion.identity);
                tankArray[i, j] = tank;   //将坦克引用保存到二维数组中
            }
        }
    }
    private void Update()
    {
        
        if (Input.GetKeyUp(KeyCode.Space))
        {
            ////需求一:每按一次空格键,坦克顺序缩小0.5倍
            ////tankArray[row, col].transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
            //if (++col > 3)
            //{
            //    col = 0;
            //    row++;
            //}
            //if (row > 2)
            //    row = 0;
            //需求二:每按一次空格键,坦克顺序开炮
            //tankArray[row,col].GetComponent<Tank>().ShootFire();
            ////需求三:每按一次空格,坦克按行顺序开炮
            //if (Input.GetKeyUp(KeyCode.Space))
            //{
            //    for (int col = 0; col < 4; col++)
            //    {
            //        tankArray[row, col].GetComponent<Tank>().ShootFire();
            //    }
            //    if(++row > 2)
            //        row = 0;
            //}
            //需求四:每按一次空格,坦克以列顺序开炮
            if (Input.GetKeyUp(KeyCode.Space))
            {
                for (int row = 0; row < 3; row++)
                {
                    tankArray[row,col].GetComponent<Tank>().ShootFire();
                }
                if (++col > 3)
                    col = 0;
            }
        }
    }
}

最后实现

 

 

 

 

更多推荐