资源地址
- 学习心得见(实时更新):Unity制作塔防游戏学习心得
- 原unity素材以及源码见:Unity制作塔防游戏资源以及源码
相机移动
float mouse = Input.GetAxis("Mouse ScrollWheel"); # 获取鼠标轮滑
transform.Translate(new Vector3(h * speed, mouse * mspeed, v * speed) * Time.deltaTime, Space.World);
# Space.World 相对世界坐标的移动
敌人生成
[System.Serializable] //表面该类可序列化,可直接在Unity上显示操作
// 协成开始
void Start()
{
StartCoroutine(EnemyGenerate());
}
// 协成生成敌人
IEnumerator EnemyGenerate()
{
foreach (Wave wave in waves)
{
for (int i = 0; i < wave.count; i++)
{
GameObject.Instantiate(wave.enemy, MONSTER_START.position, Quaternion.identity);
enemyCount++;
if (i != wave.count - 1)
{
yield return new WaitForSeconds(wave.rate);
}
}
while (enemyCount > 0)
yield return 0;
// 一波敌人结束后才生成另一波敌人
yield return new WaitForSeconds(waveTime);
}
}
创建炮塔
切换炮塔事件
![1527150238](E:\unity3d\Tower Defense\doc\1527150238.png)
- 点击Toggle Inspector里面对应的On Value Changed,绑定改变炮塔对应调用的函数
获取鼠标点击的游戏对象
// 返回一个从相机到屏幕点的光线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// debug
Debug.DrawRay(ray.origin, ray.direction * 10, Color.yellow);
RaycastHit hit; // 存放碰撞物体的信息
bool isCollider;
// ray:射线对象
// layerMask:选择那个层进行碰撞检测
// hit:存放碰撞物体的信息
// maxDistance:最远距离
isCollider = Physics.Raycast(ray, out hit, 1000, LayerMask.GetMask("MapCube"));
if (isCollider)
{
// 得到点击的mapcube
GameObject mapCube = hit.collider.gameObject;
}
地图方块控制
[HideInInspector] // 不需要显示在面板