如何制作塔防游戏 代码,操作,说明——Unity 5.3.5f1

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何制作塔防游戏 代码,操作,说明——Unity 5.3.5f1相关的知识,希望对你有一定的参考价值。

 

       我以前使用过unity但是第一次写这么全面的塔防小游戏。我以后会陆续的将我跟过的一些项目的心得经验与体会发表出来希望各位能人能够给出评价,我在此感激各位的批评与赞扬。另外我只是一个学生学艺不精,粗制滥造还请看不过去的大神放过................0.0................................

 首先是路径的管理设置

using UnityEngine;
using System.Collections;

namespace RayGame{
    
    public class PathManager : MonoBehaviour {

        //路点数组
        public GameObject[] Path1;
        public GameObject[] Path2;

        /// <summary>
        /// 返回路点
        /// </summary>
        /// <returns>The node.</returns>
        /// <param name="pathId">路径索引.</param>
        /// <param name="nodeIndex">路点索引</param>
        public GameObject getNode(int pathId,int nodeIndex){
            if(pathId == 1){
                //超出路径数组范围,返回 Null
                if (nodeIndex >= Path1.Length) {
                    return null;
                } else {
                    //返回相应路点游戏对象
                    return Path1 [nodeIndex];
                }
            }else{
                if (nodeIndex >= Path2.Length) {
                    return null;
                } else {
                    return Path2 [nodeIndex];
                }
            }
        }
    }

}

然后是游戏玩家管理以及设置

// Authors:Liu Yong
// Email: <[email protected]>
// QQ:1931195500

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
namespace RayGame{
	
	public class GameManager : MonoBehaviour {
		Animator canvasAnim;
		//最大生命值
		public int totalLife = 20;
		//最大金钱值
		public int totalGold = 200;
		//当前生命值
		int curLife = 0;
		//当前金币
		int curGold = 0;

		UIManager uiMgr;

		public int[] towerPrices;
		void Awake(){
			uiMgr = GameObject.Find ("UIManager").GetComponent<UIManager> ();
			canvasAnim = uiMgr.GetComponent<Animator> ();
		}

		void Start(){
			DataInit ();
			UIInit ();
		}

		//数据初始化
		void DataInit(){
			curLife = totalLife;
			curGold = totalGold;
		}

		//UI界面初始化
		void UIInit(){
			uiMgr.SetHeartValue (curLife);
			uiMgr.SetGoldValue (curGold);
		}

		//添加金钱
		public void addGold(int num){
			curGold += num;
			uiMgr.SetGoldValue (curGold);
		}

		public void useGold(int num){
			curGold -= num;
			uiMgr.SetGoldValue (curGold);
		}

		//增加生命值
		public void addLife(int num){
			curLife += num;
			uiMgr.SetHeartValue (curLife);
		}

		public void useLife(int num){
			curLife -= num;
			uiMgr.SetHeartValue (curLife);
		}

		public bool HasEnoughLife(int num){
			return curLife - num >= 0;
		}

		public bool HasEnoughGold(int num){
			return curGold - num >= 0;
		}	
		public void ShowButton(){
			//触发动画切换
			canvasAnim.SetTrigger ("ShowStartButton");
		}

		public void EnterGame(){
			SceneManager.LoadScene ("Game2");
		}

	}

}

  怪物的管理及设置

// Authors:Liu Yong
// Email: <[email protected]>
// QQ:1931195500

using UnityEngine;
using System.Collections;
using System.Threading;
namespace RayGame{
    
    public class MonsterManager : MonoBehaviour {

        //怪物资源路径
        string monPath = "Prefabs/Monsters/Mon1";
        //刷怪点
        public Transform spawnPoint;
        //刷新时间
        //public float spawnInterval =3f;

        void Start()
        {
            for (int i=0; i<= 5; i++)
            {  
                Spawn();
            }
            InvokeRepeating ("Start2",35,20);
        }


        void Start2(){
            for (int i=0; i<= 5; i++)
            {  
                Spawn();
            }

        }
        void Spawn(){
            
            //随机数生成,半闭半开区间
            //加载ra物资源,并实例化游戏对象
                GameObject mon = (GameObject)Instantiate (Resources.Load (monPath), spawnPoint.position,
                                    Quaternion.identity);
                //关联怪物移动组件
                mon.AddComponent<MonsterMove> ();
                mon.AddComponent<MonsterHealth> ();
                mon.AddComponent<Rigidbody2D> ();
                BoxCollider2D collider = mon.AddComponent<BoxCollider2D> ();
                collider.isTrigger = true;
                   }
    }

}

攻击塔的管理及设置

// Authors:Liu Yong
// Email: <[email protected]>
// QQ:1931195500

using UnityEngine;
using System.Collections;

namespace RayGame{
	
	public class TowerManager : MonoBehaviour {

		//造塔点
		public GameObject[] TowerPoints;

		//建造过程中的图片
		public Sprite[] TowerBuilding;

		//血条资源路径
		string barPath = "Prefabs/UI/ProgressBar";

		//造塔时间
		public float buildingTime = 1f;

		//当前的造塔点
		GameObject curTowerPoint = null;
		//当前塔的类型
		int curTowerId;

		void Awake(){
			//遍历 所有造塔点
			for (int i = 0; i < TowerPoints.Length; i++) {
				GameObject tp = TowerPoints [i];
				//关联碰撞盒
				tp.AddComponent<CircleCollider2D> ();
				//关联脚本
				tp.AddComponent<TowerPoint> ();
			}
		}

		public void ShowBuilding(GameObject _towerPoint,int towerId){
			//记住造塔点
			curTowerPoint = _towerPoint;
			//记住造塔类型
			curTowerId = towerId;
			//获取渲染组件
			SpriteRenderer spRender = _towerPoint.GetComponent<SpriteRenderer> ();
			//更改精灵图片
			spRender.sprite = TowerBuilding [towerId - 1];
			//显示建造过程
			ShowProgress (_towerPoint);
		}

		void ShowProgress(GameObject towerPoint){
			GameObject barObj = (GameObject)Instantiate (Resources.Load (barPath),
				Vector3.zero,Quaternion.identity);
			//ProgressBar组件
			ProgressBar bar = barObj.GetComponent<ProgressBar> ();
			//挂载血条
			bar.SetBarParent (towerPoint.transform);
			//激活进度条
			bar.SetActive (true,buildingTime,gameObject);
		}

		public void ProgressEnd(){
			Debug.Log ("进度条结束");
			BuildTower (curTowerPoint,curTowerId,1);
		}

		/// <summary>
		/// 造塔
		/// </summary>
		/// <param name="towerPoint">造塔点</param>
		/// <param name="type">塔类型</param>
		/// <param name="level">塔的等级</param>
		public void BuildTower(GameObject towerPoint,int type,int level){
			//按照规则拼接路径
			string towerPath = "Prefabs/Towers/Tower"+type+"/Tower"+type+"_"+level;
			Debug.Log ("show path "+towerPath);
			//实例化塔对象
			GameObject tower = (GameObject)Instantiate (Resources.Load (towerPath),
				towerPoint.transform.position, Quaternion.identity);
			Tower tw = tower.AddComponent<Tower> ();
			tw.SetTowerType (type);
			tw.TowerInit ();

			//删除造塔点
			Destroy (towerPoint);
		}

	}

}

  UImanger的管理及设置

// Authors:Liu Yong
// Email: <[email protected]>
// QQ:1931195500

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

namespace RayGame{
	
	public class UIManager : MonoBehaviour {

		string panelPath = "Prefabs/UI/TowerPanel";

		//指向当前打开的面板
		GameObject curPanel = null;

		//指向点击的当前的造塔点
		public GameObject curTowerPoint = null;

		public Text heartValue;
		public Text goldValue;
		public Text waveValue;


		/// <summary>
		/// 在指定位置显示面板
		/// </summary>
		/// <param name="pos">指定的位置</param>
		public void ShowTowerPanel(Vector3 pos,GameObject towerPoint){
			if(curPanel != null){
				Destroy (curPanel);
			}
			curPanel = (GameObject)Instantiate (Resources.Load (panelPath),
				pos,Quaternion.identity);

			//记录当前点击的造塔点
			curTowerPoint = towerPoint;
		}

		public void CloseTowerPanel(){
			Destroy (curPanel);
		}

		public void SetHeartValue(int val){
			heartValue.text = val.ToString ();
		}

		public void SetGoldValue(int val){
			goldValue.text = val.ToString ();
		}

		public void SetWaveValue(int val){
			waveValue.text = val.ToString ();
		}
	}

}

  另外其实还需要大量的动态图片,路径点设置,路径选择。各种绑定的工作没有办法在这上面演示。想要完整的文件私下qq邮箱我[email protected]

 

以上地图所具备的组件已经都完成了。接下来就是塔防,买塔,怪物移动,怪物受到攻击以及打死怪赚钱等等行为的代码

技术分享

 

以上是关于如何制作塔防游戏 代码,操作,说明——Unity 5.3.5f1的主要内容,如果未能解决你的问题,请参考以下文章

unity3D游戏开发实战原创视频讲座系列9之塔防类游戏开发第一季

如何制作一个塔防小游戏

Unity 将游戏对象乱序存储在我的数组中

使用Unity创建塔防游戏(Part1)

Unity塔防游戏源码Warfront Defenders Playmaker Kit v1.7

cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第三步---编辑器---更方便很多其它操作更像编辑器