T04_unity坦克阵列 c#
首先创建一个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;
}
}
}
}
最后实现
更多推荐


所有评论(0)