27823人加入学习
(125人评价)
如何制作塔防游戏(基于Unity5.5)
价格 免费

Add Layer 添加层,射线检测只检测MapCube这一层。

MapCube 层

设置MapCube的Layer为MapCube层。

检查是否在UI层

EventSystem.IsPointerOverGameObject() == true 就是鼠标在UI层

using UnityEngine;
using UnityEngine.EventSystems;

public class BuildManager : MonoBehaviour
{
    public TurretData laserTurretData;
    public TurretData missileTurretData;
    public TurretData standardTurretData;

    //表示当前选择的炮台(要建造的炮台)
    private TurretData selectedTurretData;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if(EventSystem.current.IsPointerOverGameObject() == false)
            {
                //开发炮台的建造
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;
                bool isCollider =  Physics.Raycast(ray, out hit, 1000, LayerMask.GetMask("MapCube"));
                if(isCollider)
                {
                    GameObject mapCube = hit.collider.gameObject;//得到点击的mapCube
                }
            }
        }
    }

    public void OnLaserSelected(bool isOn)
    {
        if(isOn)
        {
            selectedTurretData = laserTurretData;
        }
    }
    public void OnMissileSelected(bool isOn)
    {
        if(isOn)
        {
            selectedTurretData = missileTurretData;
        }
    }
    public void OnStandardSelected(bool isOn)
    {
        if(isOn)
        {
            selectedTurretData = standardTurretData;
        }
    }
}

 

[展开全文]
遗失的星空 · 2021-04-03 · 该任务已被删除 0

 Vector3 dir = target.positiontransform.position;

dir.magnitude//求向量的长度

 

[展开全文]
CMY1998 · 2020-01-27 · 该任务已被删除 0
using UnityEngine;

public class MapCube : MonoBehaviour
{
    [HideInInspector]
    public GameObject turrerGo; //保存当前Cube身上的炮台

    public void BuildTurret(GameObject turretPrefab)
    {

    }
}
using UnityEngine;
using UnityEngine.EventSystems;

public class BuildManager : MonoBehaviour
{
    public TurretData laserTurretData;
    public TurretData missileTurretData;
    public TurretData standardTurretData;

    //表示当前选择的炮台(要建造的炮台)
    private TurretData selectedTurretData;

    public int money = 1000;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (EventSystem.current.IsPointerOverGameObject() == false)
            {
                //开发炮台的建造
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;
                bool isCollider = Physics.Raycast(ray, out hit, 1000, LayerMask.GetMask("MapCube"));
                if (isCollider)
                {
                    MapCube mapCube = hit.collider.gameObject.GetComponent<MapCube>();//得到点击的mapCube
                    if (mapCube.turrerGo == null)
                    {
                        //可以创建
                        if (money > selectedTurretData.cost)
                        {
                            money -= selectedTurretData.cost;
                            mapCube.BuildTurret(selectedTurretData.turretPrefab);
                        }
                        else
                        {
                            //TODO 提示钱不够
                        }
                    }
                    else
                    {
                        //TODO 升级处理
                    }
                }
            }
        }
    }

    public void OnLaserSelected(bool isOn)
    {
        if(isOn)
        {
            selectedTurretData = laserTurretData;
        }
    }
    public void OnMissileSelected(bool isOn)
    {
        if(isOn)
        {
            selectedTurretData = missileTurretData;
        }
    }
    public void OnStandardSelected(bool isOn)
    {
        if(isOn)
        {
            selectedTurretData = standardTurretData;
        }
    }
}

 

[展开全文]
遗失的星空 · 2021-04-03 · 该任务已被删除 0

射线检测检测敌人是否在攻击范围之内如果在攻击范围之内我们攻击最先检测到的敌人

设置攻击范围碰撞器触发器修改成触发器另外添加刚体检测然后监听一下触发事件创建一个进入一个离开的触发器可能有很多的敌人炮塔只攻击最先检测到的敌人然后定义一个list存放所有检测到的敌人这样攻击最先检测到的在攻击下一个然后通过标签检测标签来确认进去的是否是敌人如果标签正确就添加到集合里当离开时就从集合里删除

[展开全文]

添加爆炸特效

添加particle sysytem 修改renderer为3d像素风格

创建红色爆炸材质explosioneffect

将材质设知道particle sysytem

修改爆炸动画参数,bursts,startspeed duration startlifetime

size 由大变小,取消looping不循环播放

注:对于高速运动物体检测时,将collision detection 改成continuous dynamic属性,修改失败,改成距离判断实现,发生爆炸后记得销毁explosion碰撞

[展开全文]
dadalang · 2017-07-31 · 该任务已被删除 0

子弹飞行

定义target目标

设置伤害值

速度

子弹移动transform.translation(verct3.forward * speed*time.delay)

[展开全文]
dadalang · 2017-07-31 · 该任务已被删除 0

注册按钮 ,现在画布canvas创建按钮,创建按钮gameobject,在gameobjec中创建脚本,生命start 和 end函数,再回到canvas中将按钮button添加事件跟gameobject关联,然后选择关联的函数。

[展开全文]
dadalang · 2017-08-01 · 该任务已被删除 0

视频中的void UpdateEnemys();方法可以简化成:void UpdateEnemys()
    {
        for (int i = 0; i < Enemys.Count; i++)
        {
            if (Enemys[i]==null)
            {
                Enemys.RemoveAt(i);
                i--;
            }
        }
    }

移除空元素后,索引减一,Enemys数量减一,

新生成一个Enemys集合,索引 i 前无空对象,只需再查找i和i后的集合。

视频中搞复杂了

[展开全文]
高伟程 · 2019-04-13 · 该任务已被删除 0

if (laserRenderer.enabled==false)
            {
                laserRenderer.enabled = true;
                laserEffect.SetActive(true);
            }

我写成了 laserEffect.SetActive(false);卡了我很久

[展开全文]

创建end动作文件夹,给背景的alpha值添加关键帧,game over改变位置使其自上而下出现,重玩和菜单则从两边过来,添加位置关键帧

[展开全文]
吼后 · 2019-06-19 · 该任务已被删除 0

改画布为world space进行渲染,移除背景图片和canvas render。文字改为开始游戏,将canvas调至炮台头部,适当调整其位置使其合适,同样步骤创建退出按钮,适当调整摄像机位置使其游戏视图完整。改按钮button脚本transition为animation,改animation的controller为按钮,

[展开全文]
吼后 · 2019-06-19 · 该任务已被删除 0

using UnityEngine;
using System.Collections;

public class ViewController : MonoBehaviour {
    public float speed = 1;
    public float MouseSpeed = 60; 
    // Update is called once per frame
    void Update () {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        float mouse = Input.GetAxis("Mouse ScrollWheel");
        transform.Translate(new Vector3(h*speed, mouse*MouseSpeed, v*speed)*Time.deltaTime,Space.World);

    
    }
}

[展开全文]
Anxuanzi2016 · 2016-12-23 · 该任务已被删除 0

MainCamera 控制摄像机的移动和缩放

ViweController()

{

float h = input.GetAxis("Horizontal");

float v = input.GetAxis("Vertical");

transform.translate(new Vector3(h,mouse,v)*time.deltatime*speed,Space.World);//世界坐标系

float mouse = input.GetAxis("Mouse ScrollWheel");//鼠标滑轮

}

需要记住的:物体移动,可以通过水平,垂直一步控制他的缩放和移动。

鼠标滚轮的值0-1

[展开全文]
侯中斌 · 2016-12-25 · 该任务已被删除 0

15分27秒Missile炮台升级版本

 

[展开全文]
CMY1998 · 2020-01-28 · 该任务已被删除 0

课时5 敌人路径管理

路径点:

WayPoint 用空物体,在关键转折点摆放位置。

创建路径点,路径点

public static TransForm[] position;

void Awake()

{

  position = new Transform[transform.ChildCount];

for(int i =0,i < position.Length;i++)

{

   position[i] = transform.GetChild(i);

}

}

 

获取他的儿子 GetChild()

 

[展开全文]
侯中斌 · 2016-12-24 · 该任务已被删除 0

NullReferenceException: Object reference not set to an instance of an object//出现这种问题就是没有在Start实例化对象

[展开全文]
CMY1998 · 2020-01-28 · 该任务已被删除 0

课时6 创建敌人 控制敌人移动

去除start和end的碰撞体,避免他们和我们的敌人发生碰撞

Enemy()

{

 Transform[] position;

 int index = 0;

void Start()

 {

  position = WayPoint.position;

 }

 

void Update()

{

  Move();

}

void Move()

{

if(index >= position.Length -1)

   return;

 transform.translate((position[index].position - transform.position).normalized*speed*time.deltaTime)

if(vector3.Distance(position[index].position,transform.position)<0.1f)

{

  index++;

}

}

}

获取路径点,路径点索引从0开始到最后,超过索引,就什么都不做,没有超过就执行移动脚本。

[展开全文]
侯中斌 · 2016-12-25 · 该任务已被删除 0

生成点——新建GameObject,还可以让点显示出来

 

[展开全文]
许飞 · 2019-10-08 · 该任务已被删除 0

课时7 创建敌人生成器 

创建多种不同类型的敌人

敌人一波一波的生成,针对每一波生成需要的属性,进行定义

 

[System.Serializable] //表示可以序列化

public class Wawe()//只保存每波敌人的属性不继承于Monodevelop

{

public GameObject enemyPrefab;//敌人的类型

public int count;//敌人的数量

public float rate;//等待时间

}

创建敌人管理器

EnemyManager()

{

public Transform start;//生成的开始位置

public Wawe[] wawes;//多少波敌人的数组

void Start()

{

  startCoroutine(ManageEnemy());//在start函数中启动协程

}

IEnumberator ManageEnemy()

{

 foreach(Wawe wawe in waves)

 {

  for (int i = 0;i<wawe.count;i++)

   {

    GameObject.Instantiate(wave.enemyPrefab,start.position,Quaternion.identity);

if(i != wave.count-1)

   yield return new        WaitForSeconds(wave.rate);//如果他不是最后一个才进行暂停

   }

yield return new WaitForSeconds(3.0f);//每生成一波之后暂停一下

 }

}

}

[展开全文]
侯中斌 · 2016-12-25 · 该任务已被删除 0