有两种模式,电脑人对战、玩家pk
玩家1:ws控制移动、ad控制转向、空格控制开火
玩家2:上下箭头控制移动,左右箭头控制转向,enter控制开火
导入美术资源。
设置天空颜色为蓝色,调节光亮
设置摄像机合适的位置
相机设置为正交视图
制作坦克
添加碰撞体
添加刚体,y轴移动设置为冻结,x轴、z轴旋转设置为冻结
脚本:玩家1ws控制坦克前后移动,ad控制坦克旋转;
玩家2前后控制坦克前后移动,左右控制坦克旋转;
打开输入设置
玩家1移动、攻击方式
玩家2移动、攻击方式
float v = Input.GetAxis("Vertical"+number);
rigidbody.velocity = transform.forward * v * speed1;
float h = Input.GetAxis("Horizontal"+number);
rigidbody.angularVelocity = transform.up * h * spped2;
给坦克左右履带,都添加上粒子效果
子弹模型添加网格碰撞体、勾选“凸面”
勾选 触发器
添加刚体
添加爆炸粒子效果
撞到任何碰撞体,都发生爆炸
爆炸后销毁子弹
public void OnTriggerEnter(Collider collider){
GameObject.Instantiate(ex,transform.position,transform.rotation);
GameObject.Destroy(this.gameObject);
}
爆炸粒子效果持续1.5秒,脚本挂载到粒子效果上
Destroy(this.gameObject,time);
子弹要在固定炮口反射,创建空物体
在发射点实例化子弹、设置子弹发射
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 frame
void 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 update
public int hp=100;
public GameObject ex;
public AudioClip noise;
void Start()
{
}
// Update is called once per frame
void 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;
}
}
脚本挂载到坦克上
拖入滑动条
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);
}
}
}
https://wwez.lanzoul.com/iBG3n0t7931a