Unity 塔防笔记

这篇具有很好参考价值的文章主要介绍了Unity 塔防笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2023.12.18

一、地图的创建

用了15*15的Cube做地图,然后删除相应的点形成一条路径。画面缩放和移动: Input.GetAxis("") 是 Unity 引擎中的一个方法,用于获取游戏玩家在键盘或游戏手柄上输入的某个轴(Axis)的值。这里的 "" 是一个字符串参数,表示要获取的轴的名称。

    void Update () {
        //水平轴 该轴默认是由A、D以及方向键左右箭头来触发!
        float h = Input.GetAxis("Horizontal");
        //垂直轴 该轴默认是由W、S以及方向键上下箭头来触发!
        float v = Input.GetAxis("Vertical");
        //鼠标滚轮
		float mouse = Input.GetAxis("Mouse ScrollWheel");
        //每一帧都在运行 要 * Time.deltaTime  因为这里摄像机翻转了 需要用世界坐标而不是local
        transform.Translate(new Vector3(v*speed, mouse*MouseSpeed, h*speed  ) * Time.deltaTime ,Space.World);
	}

二、敌人的移动

创建了拐角对象 调用Translate方法 单位化让敌人移动

ps:如果要在一个类里面实例化另一个类的多个对象 需要在另一个类上面添加可序列化代码 [System.Serializable]

三、创建敌人孵化器及优化

Instantiate方法

IEnumerator SpawnEnemy()
	{
		foreach (Wave wave in waveList)
		{
			for (int i = 0; i < wave.count; i++)
			{
				GameObject.Instantiate(wave.EnemyPrefab, START.position,Quaternion.identity);
				ActiveCount++;
                if (i!=wave.count-1)
				yield return new WaitForSeconds(wave.rate);
			}
			while(ActiveCount>0)
			{
				yield return 0;
			} 
			yield return new WaitForSeconds(WaitGroupTime);
		}
		
	}
	void ReachEnd()
	{
		GameObject.Destroy(this.gameObject);
	}
	//销毁后传递消息给销毁方法 让存活敌人减一
	void OnDestroy()
	{
		EnemySpawn.ActiveCount--;
	}

通过监听Destory 传递消息给Destory方法 使敌人数量减一

四、创建数据类

创建数据类(属性类)不需要继承自 MonoBehaviour类,不然Inspector面板上不能显示列表属性

五、创建炮台

这里用到了射线 用摄像机发出的射线到Cube上得到对象。ps:注意添加Mask标记 不然射线不生效

六、金钱不够的闪烁动画

Animation用法  添加关键帧        

七、利用粒子特效来实现坦克建造时的特效

effect-Partic System

八、坦克与敌人碰撞检测

1.Collider的消息函数,不要改函数名

OnTriggerEnter GameObject 与另一个 GameObject 碰撞时,Unity 会调用 OnTriggerEnter。
OnTriggerExit 当 Collider other 已停止接触该触发器时调用 OnTriggerExit。

2.性能优化 Edit-Progecting-Physics  设置坦克和敌人的碰撞层 只相互碰撞

九、子弹攻击敌人

public class Bullet : MonoBehaviour {
    public float Damage=50;
    public float Speed=40;
    private Transform target;
    public void Move(Transform _target)
    {
        this.target = _target;
    }
    void Update()
    {
        //子弹朝向
        transform.LookAt(this.target);
        //Translate移动 *时间和速度
        transform.Translate(Vector3.forward * Time.deltaTime * Speed);
    }
}
void Attack()
    { 
        //得到子弹
        GameObject bullet=  GameObject.Instantiate(BulletPrefab, BulltPos.position,BulltPos.rotation);
       //得到挂在子弹上的Bullet代码组件调用Move方法 指向敌队列的第一个敌人
        bullet.GetComponent<Bullet>().Move(Enemy[0].transform);
    }

十、敌人队列销毁的更新处理

创建了两个数组,更新时要减去之前更新的元素个数保证按下标删除

    //更新Enmey数组
    void UpdateEnemy()
    {
        List<int> EmptyList= new List<int>();
        for (int i = 0; i <Enemy.Count; i++)
        {
            if (Enemy[i]==null)
            {
                EmptyList.Add(i);
            }
        }
        for (int j = 0; j < EmptyList.Count; j++)
        {
            //每移动一个元素 队列其他元素往前移 -j才能删除
            Enemy.RemoveAt(EmptyList[j]-j);
        }
    }

十一、实现坦克头朝敌人效果

        //让坦克头朝向敌人
        if (Enemy.Count > 0 && Enemy[0]!=null)
        {
            Vector3 targetPosition = Enemy[0].transform.position;
            //控制敌人和坦克在垂直方向上一致
            targetPosition.y = TurretHead.position.y;
            TurretHead.LookAt(targetPosition);
        }

Unity 塔防笔记,unity,笔记,游戏引擎

Unity 塔防笔记,unity,笔记,游戏引擎

这里旋转要注意坦克的头部和坦克本身的中心点是否一致,不一致就导致不能实现预期效果,需要在坦克上建一个空物体 再把坦克头部放到空物体里面(这里还要注意保持这个空物体的Z轴即坦克头部子弹方向和坦克头部一致 先要把空物体的Z轴设置好了再把头部放进去  步骤不能倒置!)保持中心点一致。 

十二、鼠标在MapCube上时显示红色

坦克的圆形碰撞器和鼠标有反应导致在一个坦克周围不显示红色,此时需要把Edit-Progecting-Physics里的Queries Hit Triggers取消勾选

Unity 塔防笔记,unity,笔记,游戏引擎

    //鼠标在MapCube上时显示红色
    void OnMouseEnter()
    {
        if(Turret==null&&EventSystem.current.IsPointerOverGameObject()==false)
        {
            renderer.material.color = Color.red;
        }
    }
    void OnMouseExit()
    {
        renderer.material.color = Color.white;
    }

十三、升级和拆除UI

创建动画

 Unity 塔防笔记,unity,笔记,游戏引擎

十四、坦克射线攻击的实现

Line Renderer组件 

 if(Enemy.Count > 0)
                {
                    lineRenderer.SetPositions(new Vector3[] { BulltPos.transform.position, Enemy[0].transform.position });
                }

Unity 塔防笔记,unity,笔记,游戏引擎

十五、如何判定成功

IEnumerator SpawnEnemy()
	{
		foreach (Wave wave in waveList)
		{
			for (int i = 0; i < wave.count; i++)
			{
				GameObject.Instantiate(wave.EnemyPrefab, START.position,Quaternion.identity);
				ActiveCount++;
                if (i!=wave.count-1)
				yield return new WaitForSeconds(wave.rate);
			}
			while(ActiveCount>0)
			{
				yield return 0;
			} 
			yield return new WaitForSeconds(WaitGroupTime);
		}
		while(ActiveCount>0)
		{
			yield return 0;
		}
		GameManager.instance.Success();
		
	}

Unity 塔防笔记,unity,笔记,游戏引擎

在这里while循环AcctiveCount存活敌人数量 yeild return 0 循环返回 最后AcctiveCount等于0即游戏成功

十六、一些方法

1.设计开始结束页面UI时,如果做的3D用到的Canvas画布通常要设置成世界空间 

Unity 塔防笔记,unity,笔记,游戏引擎

2....太晚了有时间更文章来源地址https://www.toymoban.com/news/detail-781558.html

到了这里,关于Unity 塔防笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity 塔防笔记

    2023.12.18 一、地图的创建 用了15*15的Cube做地图,然后删除相应的点形成一条路径。 画面缩放和移动 : Input.GetAxis(\\\"\\\") 是 Unity 引擎中的一个方法,用于获取游戏玩家在键盘或游戏手柄上输入的某个轴(Axis)的值。这里的 \\\"\\\" 是一个字符串参数,表示要获取的轴的名称。 二、敌

    2024年02月02日
    浏览(23)
  • 【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏4(附项目源码)

    本期紧接着上一篇,本期主要内容是实现商店、购买、出售、升级等功能。 新增TurretSettings 配置不同炮塔参数 绘制商店UI 新增TurretCard,渲染商品数据,如果前面有绘制价格文本,还可以渲染价格文本,这里我就偷懒不弄了 挂载脚本,并配置 新增TurretShopManager,商店管理器

    2024年01月21日
    浏览(63)
  • 【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏1(附项目源码)

    当今,塔防游戏已经成为游戏市场上备受欢迎的一类游戏类型。《保卫萝卜》作为其中的经典之作,深受玩家喜爱。本项目旨在基于《保卫萝卜》的玩法和特点,开发一个Unity2D塔防游戏,让玩家可以在游戏中体验到精彩的策略对抗与刺激的关卡挑战。 本项目将通过Unity引擎进

    2024年02月04日
    浏览(55)
  • 【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏5(附项目源码,完结)

    本期是本项目的最后一篇,主要内容是配置环境、生成不同敌人、结束重开。 我用的环境素材 https://assetstore.unity.com/packages/2d/environments/2d-sugar-world-asset-pack-urp-256585

    2024年02月05日
    浏览(58)
  • Unity Physics2D 2d物理引擎游戏 笔记

    2d 材质 里面可以设置 摩擦力 和 弹力 Simulated:是否在当前的物理环境中模拟,取消勾选该框类似于Disable Rigidbody,但使用这个参数更加高效,因为Disable会销毁内部产生的GameObject,而取消勾选Simulated只是禁用。 Kinematic 动力学刚体 动力学刚体不受重力和力的影响,而受用户的

    2023年04月24日
    浏览(124)
  • 十八、Unity游戏引擎入门

    1、下载     首先需要下载Unity Hub,下载网址:https://unity.com/cn。     然后在其中下载Unity编辑器并安装,可选择最新版本。     接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件,例

    2024年02月16日
    浏览(79)
  • 使用团结引擎开发Unity 3D射击游戏

           本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。       本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。      本游戏是一个俯视角度的射击游戏。主角始终位于屏幕

    2024年01月19日
    浏览(78)
  • Unity、UE、Cocos游戏开发引擎的区别

    Unity、Unreal Engine(UE)和Cocos引擎是三个常用的游戏开发引擎,它们在功能和特性上有一些区别。以下是它们之间的主要区别: 编程语言:Unity使用C#作为主要的编程语言,开发者可以使用C#脚本进行游戏逻辑编写。Unreal Engine主要使用C++作为编程语言,但也支持蓝图系统,允许

    2024年02月22日
    浏览(66)
  • Unity vs Godot :哪个游戏引擎更适合你?

    游戏引擎的选择对开发过程和最终产品质量有着重大影响。近年来,Godot和Unity这两款引擎受到广泛关注。本文将从多个维度对两者进行比较,以期为开发者提供正确的选择建议。 Godot和Unity都有各自的优势,没有绝对的好坏之分。Godot开源免费,上手简单,更适合2D和小型游戏

    2024年01月23日
    浏览(98)
  • 30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 🌲Unity实战100例专栏推荐:Unity 实战100例 教程 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长

    2024年02月11日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包