> 文章列表 > 3d坦克大战

3d坦克大战

3d坦克大战

文章目录

  • 一、 介绍
  • 二、 导入美术资源、调节光亮
  • 三、 坦克脚本
  • 四、 添加坦克移动效果、挂载脚本
  • 五、 制作子弹预制体、脚本
  • 六、 子弹发射点、发射子弹脚本
  • 七、 坦克血量脚本
  • 八、 设置相机视角
  • 九、 设置环形滑动条,表示hp
  • 十、 下载素材包

一、 介绍

有两种模式,电脑人对战、玩家pk
玩家1:ws控制移动、ad控制转向、空格控制开火
玩家2:上下箭头控制移动,左右箭头控制转向,enter控制开火

3d坦克大战


二、 导入美术资源、调节光亮

导入美术资源。
设置天空颜色为蓝色,调节光亮
设置摄像机合适的位置
相机设置为正交视图

3d坦克大战
3d坦克大战


三、 坦克脚本

制作坦克
添加碰撞体
添加刚体,y轴移动设置为冻结,x轴、z轴旋转设置为冻结
脚本:玩家1ws控制坦克前后移动,ad控制坦克旋转;玩家2前后控制坦克前后移动,左右控制坦克旋转;
打开输入设置
玩家1移动、攻击方式
玩家2移动、攻击方式

3d坦克大战

3d坦克大战

float v = Input.GetAxis("Vertical"+number);rigidbody.velocity = transform.forward * v * speed1;float h = Input.GetAxis("Horizontal"+number);rigidbody.angularVelocity = transform.up * h * spped2;

四、 添加坦克移动效果、挂载脚本

给坦克左右履带,都添加上粒子效果

3d坦克大战


五、 制作子弹预制体、脚本

子弹模型添加网格碰撞体、勾选“凸面”
勾选 触发器
添加刚体
添加爆炸粒子效果

3d坦克大战

撞到任何碰撞体,都发生爆炸
爆炸后销毁子弹
public void OnTriggerEnter(Collider collider){GameObject.Instantiate(ex,transform.position,transform.rotation);GameObject.Destroy(this.gameObject);}
爆炸粒子效果持续1.5秒,脚本挂载到粒子效果上
	    Destroy(this.gameObject,time);

六、 子弹发射点、发射子弹脚本

子弹要在固定炮口反射,创建空物体

3d坦克大战

在发射点实例化子弹、设置子弹发射
	public GameObject shellpoint;public KeyCode firekey=KeyCode.Space;private Transform firepoint;public float shellspeed = 100;void Start(){firepoint=transform.Find("point");}// Update is called once per framevoid Update(){if (Input.GetKeyDown(firekey)){GameObject go=GameObject.Instantiate(shellpoint,firepoint.position,firepoint.rotation);go.GetComponent<Rigidbody>().velocity=go.transform.forward*shellspeed;	}}

七、 坦克血量脚本

坦克初始 hp:100
受到一次子弹攻击,血量减random(10,20)
hp<0,播放爆炸粒子效果ex
销毁坦克
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class health: MonoBehaviour
{// Start is called before the first frame updatepublic int hp=100;public GameObject ex;public AudioClip noise;void Start(){}// Update is called once per framevoid Update(){}public void tankdamage(){if (hp<=0){return;}hp-=Random.Range(10,20);if (hp<=0){AudioSource.PlayClipAtPoint(noise,transform.position);GameObject.Instantiate(ex,transform.position+Vector3.up,transform.rotation);GameObject.Destroy(this.gameObject);}}
}

八、 设置相机视角

复制坦克,作为玩家2。
玩家1、玩家2距离越远,相机拉长越远。
玩家1、玩家2距离越近,相机拉长越近。脚本挂载到相机上
public class CAM1 : MonoBehaviour 
{//声明公共的Transform类型的变量player1和player2,用于存储游戏对象的位置信息public Transform player1;public Transform player2;//声明私有的Camera类型的变量camara和Vector3类型的变量offset,用于存储摄像机的引用和偏移量private Camera camara;private Vector3 offset;void Start() {//计算偏移量offset = transform.position - (player1.position + player2.position) / 2;//获取摄像机的引用camara = this.GetComponent<Camera>();}void Update() {//判断player1和player2是否为空,如果为空则返回if (player2 == null || player1 == null)return;//根据player1和player2的位置计算摄像机的位置transform.position = (player1.position + player2.position) / 2 + offset;//计算player1和player2之间的距离float distance = Vector3.Distance(player1.position, player2.position);//如果距离小于等于5,则返回if (distance <= 5f){return;}//计算摄像机的正交大小float size = distance * 0.875f;//设置摄像机的正交大小camara.orthographicSize = size;}
}

3d坦克大战


九、 设置环形滑动条,表示hp

3d坦克大战

脚本挂载到坦克上
拖入滑动条
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using UnityEngine.UI; public class health: MonoBehaviour //定义一个名为health的公共类,继承自MonoBehaviour类
{//声明公共的int类型变量hp,GameObject类型变量ex,和AudioClip类型变量noise,用于存储坦克的生命值、爆炸特效和爆炸音效public int hp = 100;public GameObject ex;public AudioClip noise;//声明私有的Slider类型变量hpslider和int类型变量hpTotal,用于显示坦克的生命值条和存储坦克的总生命值public Slider hpslider;private int hpTotal;void Start() //在开始时调用的函数{hpTotal = hp; //将hp赋值给hpTotal}void Update() //每帧更新时调用的函数{}//当坦克受到伤害时调用的函数public void tankdamage(){if (hp <= 0) //如果生命值小于等于0,则返回{return;}hp -= Random.Range(10, 20); //生命值减去一个10到20之间的随机数//设置生命值条的值hpslider.value = (float)hp / hpTotal;if (hp <= 0) //如果生命值小于等于0,则播放音效、实例化爆炸特效,并销毁坦克对象{AudioSource.PlayClipAtPoint(noise, transform.position);GameObject.Instantiate(ex, transform.position + Vector3.up, transform.rotation);GameObject.Destroy(this.gameObject);}}
}

3d坦克大战


十、 下载素材包

https://wwez.lanzoul.com/iBG3n0t7931a