3d坦克大战

news2025/1/18 20:28:00

文章目录

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


一、 介绍

有两种模式,电脑人对战、玩家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;
    }
}

在这里插入图片描述


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

在这里插入图片描述

脚本挂载到坦克上
拖入滑动条
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






本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422705.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计网第五章.运输层—TCP报文的首部

以下来自湖科大计算机网络公开课笔记及个人所搜集资料 TCP报文格式如下&#xff1a; 那6个标志位对应的中文名&#xff1a; 下面是按TCP首部的顺序介绍各个字段&#xff1a; 源端口和目的端口分别是表示发送TCP报文段的应用进程。从网络编程角度&#xff0c;进程里创建sock…

01.容器接口BeanFactory和ApplicationContext

容器接口BeanFactory和ApplicationContext BeanFactory能做哪些事ApplicationContext有哪些扩展功能事件解耦 重点 到底什么是BeanFactory 它是 ApplicationContext 的父接口它才是 Spring 的核心容器, 主要的 ApplicationContext 实现都【组合】了它的功能 BeanFactory 能干点…

【计算机网络复习】第四章 网络层 1

网络层的位置和基本功能 o 实现了端到端&#xff08;主机-主机&#xff09;的数据传输 o 路由选择 n 根据数据携带的目的主机地址为数据包选择一条的路径&#xff0c;以到达目的主机 o 主机/路由器编址 n 每个网络接口有一个唯一的IP地址 o 网络互联 n 在不同的网…

mysql数据库使用sql对特殊分隔符分隔的字段进行统计

需求 在一个数据库表中有一个字段中的数据是通过特殊符号进行分隔的&#xff0c;现需要统计分隔符分开的各数据的条数。 数据准备 -- ---------------------------- -- Table structure for persons -- ---------------------------- DROP TABLE IF EXISTS persons; CREATE TAB…

Linux 基本使用和程序部署

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录Linux 常用命令lspwdcdtouchcatechovimmkdirrmmvcp搭建 Java 部署环境yumjdktomcatmysql部署 Web 项目到 Linux数据库建表微调…

万亿氢能赛道上,谁在发挥“关键力量”?谁在扮演“关键先生”?

NBA比赛中&#xff0c;在急速变化的时刻要想赢得胜利&#xff0c;需要有一股“关键力量”。 这股“力量”一方面能够组织好队员之间的协同&#xff0c;更加灵活和精准地推进战术&#xff0c;另一方面能够击中对方防守的痛点&#xff0c;投入制胜一球。这种“关键力量”通常是由…

BTP 使用SPA开发工作流

1、前言 目前SAP ABAP 工作流比较难用&#xff0c;BTP上的工作流比较简单便捷。 BTP上面有两款服务可以执行工作流&#xff0c;一种是workflow management 配合Business Rules Services简称BRS&#xff0c;还有一种是接下来会介绍的SP Bulide Process Automation 简称SBPA。 …

【linux】Ubuntu aarch64编译安装RXTX进行串口通信

目录1.下载RXTX2.源码下载方式一&#xff1a;方式二&#xff1a;3. 编译源码4.编译源码时遇到的问题问题1&#xff1a;./configure command not found问题2&#xff1a;error: UTS_RELEASE undeclared问题3&#xff1a;libtool: install: armv6l-unknown-linux-gnu/librxtxRS48…

Manjaro安装及配置

官方镜像 官方镜像地址&#xff1a;https://manjaro.org/download/ 镜像选择 镜像选择&#xff1a;PLASMA、XFCE、GNOME 按电脑性能&#xff1a;PLASMA>GNOME>XFCE(老旧电脑可以运行) 启动U盘刻录 推荐使用rufus&#xff08;win10平台&#xff0c;dd模式&#xff09…

C++ [图论算法详解] 欧拉路欧拉回路

蒟蒻还在上课&#xff0c;所以文章更新的实在慢了点 那今天就来写一篇这周刚学的欧拉路和欧拉回路吧 讲故事环节&#xff1a; 在 一个风雪交加的夜晚 18世纪初普鲁士的哥尼斯堡&#xff0c;有一条河穿过&#xff0c;河上有两个小岛&#xff0c;有七座桥把两个岛与河岸联系…

万字长文:C语言实践小练习汇总指南!

万字长文&#xff1a;C语言实践小练习汇总指南!0.说在前面1.i与i总结1.1 i与i1.2 区别总结&#xff1a;2.大小写转化3.交换字符串3.1 使用传字符串地址3.2 使用strcpy函数3.3 自写字符串交换函数3.4 同3.3自写函数4.字符串中单词4.1 统计字符串中单词个数4.2 最长单词及位置5.字…

注册页面小案例

运行截图&#xff1a; 知识点&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"> <meta name&…

SwinTrack: A Simple and Strong Baseline for Transformer Tracking(NIPS2022)

SwinTrack摘要介绍相关工作方法实验摘要 近期&#xff0c;Transformer在视觉跟踪方面进行了深入探索&#xff0c;并展示了显著的潜力。然而&#xff0c;现有的基于Transformer的跟踪器主要将Transformer用于融合和增强由卷积神经网络提取的特征&#xff0c;Transformer在表征学…

另一种迁移xxl-job任务的方法,适合不满足数据迁移条件

以为多个项目组同时使用一个xxl-job&#xff0c;同时涉及到版本提升&#xff0c;由此不太满足数据库数据迁移&#xff0c;所以这里提供另一种解决办法 使用工具&#xff1a;postman,json转excel&#xff0c;excel 核心&#xff1a;excel拼接&#xff1a; 1.使用f12抓取xxl任务访…

什么是 SMART 并如何使用这个方法取得新的成就

SMART原则也许大家并不陌生&#xff0c;很多企业常常采用以激励员工更加高效的工作&#xff0c;或是被一些企业广泛采用&#xff0c;制定并实施绩效考核方案&#xff0c;SMART原则属于目标管理的范畴&#xff0c;最早是管理大师彼得德鲁克在著作中提出的。 ONLYOFFICE ONLYOFFI…

Nginx快速上手

Nginx快速上手 OVERVIEWNginx快速上手一、基本概念1.Nginx初步认识2.正向/反向代理&#xff08;1&#xff09;正向代理&#xff08;2&#xff09;反向代理二、Nginx 安装和配置1.安装2.Nginx指令3.Nginx配置三、Nginx的使用1.Web服务器&#xff08;1&#xff09;静态网页存储目…

Java对日开发成趋势?网友:找工作打开了新思路

近两年行业环境起起伏伏&#xff0c;企业降本增效&#xff0c;提高人才招聘的门槛&#xff0c;导致大家找工作时觉得越来越难&#xff0c;尤其是Java开发&#xff0c;主打的就是一个“卷”&#xff01; 不过行业变革&#xff0c;挑战与机遇并存。Java作为编程语言排行榜的常年第…

Java8 判空新写法(Optional方式)

1 引言 在文章的开头&#xff0c;先说下NPE问题&#xff0c;NPE问题就是&#xff0c;我们在开发中经常碰到的NullPointerException.假设我们有两个类&#xff0c;他们的UML类图如下图所示 在这种情况下&#xff0c;有如下代码 user.getAddress().getProvince();这种写法&…

计算机网络 实验四

⭐计网实验专栏&#xff0c;欢迎订阅与关注&#xff01; ★观前提示&#xff1a;本篇内容为计算机网络实验。内容可能会不符合每个人实验的要求&#xff0c;因此以下内容建议仅做思路参考。 一、实验目的 理解ARP协议的工作原理掌握ARP、ICMP 处理过程 二、实验内容 利用网络…

BearPi环境搭建及基本使用

这是一篇总结&#xff0c;一些坑的记录 具体教程请访问&#xff1a; BearPi-HM_Nano: 小熊派BearPi-HM Nano开发板基于HarmonyOS的源码 - Gitee.com 第一步&#xff1a;安装虚拟机 不做赘述 第二步&#xff1a;下载资源 这里要用到ubuntu的一些基础知识&#xff0c;不会的…