初学unity之3D坦克大战
1、导入资源
从unity store中下载所需资源内含坦克模型、弹药模型、地图模型…然后将资源导入unity
2、 创建属于自己的文件夹
主要包括三个文件夹
1、Scripts
2、Prefabs
3、Scenes
3、创建场景
- 在Scenes文件夹新建场景3DTanksBattle
- 将资源中的地图拖入3DTB
- 将坦克和子弹模型拖入3DTB
4、制作炮弹预制件
-
添加Rigidbody刚体
模拟炮弹物理作用,有质量和重力。 -
Add Component->Physics->RigidBody
-
添加Collider碰撞体
Add Component->Physics->Capsule Collider(胶囊碰撞体)
调整胶囊的轴向、高度、半径以贴合炮弹模型
-
添加炮弹爆炸粒子(particles)特效
从资源中找到爆炸特效拖入shell对象中
5、取消我自己的预制件与资源的关联
1、右键Hierarchy中的预制件->Prefabs->unpack
2、成功(Hierarchy中字体由蓝变白),这样对物体的操作就不会有干扰
3、将Hierarchy中处理好的预制件拖入Project中自己创建的文件夹Prefabs中
6、制作坦克预制件
-
添加RigidBody刚体
-
添加Box Collider碰撞体
坦克分上下两部分,添加两个碰撞体以贴合坦克形状 -
添加坦克粒子爆炸特效
-
添加坦克血条
1、添加UI控件:右键Tank->UI->Slider(滑动块)
2、 Fill Area的Fill Rect改为full,360°,Fill移入Slider并删除Fill Area
3、Background和Fill图片都设为圆环
Background和Fill坐标全部置零使二者重合
调色
Slider设为长宽4x4大小
-
做成预制件拖入Prefabs文件夹
7、调整光线
1、Window->Rendering->Lighting进入光源设置
2、在Environment Lighting将Source的SkyBox改为Color
3、在Scene->Lighting Settings-->new Lighting Settings
4、LightingMapping Seethings将LightingMapper设为Enlighten
5、Lighting Mode设为Subtractive
6、删除原先场景光照
8、使用脚本控制坦克行为
- 在Scripts文件夹新建脚本,命名为TankControl
使用Input控制器结合RigidBody让坦克移动
//对象声明过后要实例化才能使用
//变量名不要使用rigidbody,这个命名在基类中存在所以会被隐藏继承,除非加new--用下划线区分开
public Rigidbody _rigidbody;
// Start is called before the first frame update
void Start()
{
//this指这个脚本,此脚本的游戏对象(挂载到Tank),获取此游戏对象身上的RigidBody组件
_rigidbody = gameObject.GetComponent<Rigidbody>();//新版本不必加this
}
- Input管理器
1、打开Input Manager
2、edit->Project Settings->Input Manager
3、Horizontal(水平)、Vertical(垂直)—
public float speed = 2;//速度
public float rotateSpeed = 2;//转速
void Update()
{
//结合Input控制器
h_Value = Input.GetAxis("Horizontal1");//a,d--转弯
v_Value = Input.GetAxis("Vertical1");//s,w--前进后退
if (v_Value != 0)//为正,前进,为负,后退
{
_rigidbody.MovePosition(this.transform.position + v_Value*this.transform.forward * speed * Time.deltaTime);//Time.deltaTime--上一帧执行的时间/每帧的间隔时间
}
//转弯
if(h_Value!=0)
{
if(v_Value<0)
{
h_Value = -h_Value;//转弯逻辑
}
this.gameObject.transform.Rotate(Vector3.up * h_Value * rotateSpeed * Time.deltaTime);
}
}
- 避免坦克翻车
改变x轴和z轴
在RigidBody约束(Constraints)轴变化
- 两个坦克
枚举两个坦克
public enum TankType
{
Tank_One=1,
Tank_Two=2,
Tank_Enemy=3,
}
public TankType tankType = TankType.Tank_One;//坦克1
public string inputHorizontalStr;
public string inputVerticalStr;//使输入方式可变,wasd和上下左右
void Start()
{
//this指这个脚本,此脚本的游戏对象(挂载到Tank),获取此游戏对象身上的RigidBody组件
_rigidbody = gameObject.GetComponent<Rigidbody>();//新版本不必加this
inputHorizontalStr = inputHorizontalStr + (int)tankType;
//在unity面板中输入Horizontal和Vertical,自动根据坦克1或2来赋值Horizontal1/2和Vertical1/2
inputVerticalStr = inputVerticalStr + (int)tankType;
}
void Update()
{
//结合Input控制器
h_Value = Input.GetAxis(inputHorizontalStr;//a,d--转弯
v_Value = Input.GetAxis(inputVerticalStr);//s,w--前进后退
}
- 炮弹发射
InputManager中Fire,FIre1指向空格键
public GameObject shell;//炮弹
public Transform shellPos;//炮弹发射位置
void Start(