3d坦克大战

文章目录

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


一、 介绍

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

3d坦克大战_第1张图片


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

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

3d坦克大战_第2张图片
3d坦克大战_第3张图片


三、 坦克脚本

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

3d坦克大战_第4张图片

3d坦克大战_第5张图片

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坦克大战_第6张图片

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

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

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

3d坦克大战_第7张图片

在发射点实例化子弹、设置子弹发射
	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;
    }
}


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

3d坦克大战_第8张图片

脚本挂载到坦克上
拖入滑动条
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坦克大战_第9张图片


十、 下载素材包

https://wwez.lanzoul.com/iBG3n0t7931a






你可能感兴趣的:(项目,unity)