Unity_塔防游戏_创建路径点让敌人自动行走

1.首先创建多个空的游戏物体,用来一次规划出敌人要行走的路线,并且设置标记,方便查看

2.编写获取每个路径点的脚本WayPoint:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WayPoint : MonoBehaviour
{
    //创建一个数组 用来保存 路径点
    public static Transform[] wayPoint;

    private void Awake()
    {
        //给 保存路径点的数组 长度
        wayPoint = new Transform[transform.childCount];
        //将路径点 依次存入数组
        for (int i = 0; i < wayPoint.Length; i++)
        {
            wayPoint[i] = transform.GetChild(i);
            Debug.Log("wayPoint:"+wayPoint[i]);
        }
    }
}

将获取路径点的脚本WayPoint挂载在点的父级物体上:

 

3.编写敌人行走的方法MeneyMoving:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//敌人移动类
public class MeneyMoving : MonoBehaviour
{

    private Transform[] positions;

    public int index = 0;

    public float speed = 2f;

    // Start is called before the first frame update
    void Start()
    {
        //获取路径点 数组
        positions = WayPoint.wayPoint;
    }

    // Update is called once per frame
    void Update()
    {
        //调用敌人移动方法
        Moving();
    }

    void Moving() {
        //如果index小于 路径点数组点最大下标 就继续移动
        if (index <= positions.Length - 1) {
            //获得 单位向量
            transform.Translate((positions[index].position - transform.position).normalized * Time.deltaTime * speed);
           // transform.position =  Vector3.up * 0.3f;
            if (Vector3.Distance(positions[index].position, transform.position) <= 1f)
            {
                index++;
            }
        }

    }
}

将敌人行走的方法MeneyMoving挂载在敌人物体上:

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的防御塔游戏的代码示例,包括防御塔自动攻击敌人的逻辑: ```csharp public class Tower : MonoBehaviour { public float range = 10f; // 攻击范围 public float fireRate = 1f; // 发射速率 public GameObject bulletPrefab; // 子弹预制体 private Transform target; // 目标敌人 private float fireCountdown = 0f; // 发射倒计时 void Update() { if (target == null) // 如果没有目标敌人,则查找敌人 { FindTarget(); return; } if (fireCountdown <= 0f) // 如果发射倒计时结束,则发射子弹 { Shoot(); fireCountdown = 1f / fireRate; } fireCountdown -= Time.deltaTime; // 更新发射倒计时 } void FindTarget() { GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy"); // 查找所有敌人 float shortestDistance = Mathf.Infinity; GameObject nearestEnemy = null; foreach (GameObject enemy in enemies) // 遍历所有敌人,找到最近的敌人 { float distanceToEnemy = Vector3.Distance(transform.position, enemy.transform.position); if (distanceToEnemy < shortestDistance && distanceToEnemy <= range) { shortestDistance = distanceToEnemy; nearestEnemy = enemy; } } if (nearestEnemy != null) // 如果有找到最近的敌人,则设为目标敌人 { target = nearestEnemy.transform; } } void Shoot() { GameObject bulletGO = Instantiate(bulletPrefab, transform.position, Quaternion.identity); // 实例化子弹 Bullet bullet = bulletGO.GetComponent<Bullet>(); // 获取子弹组件 if (bullet != null) // 如果子弹组件存在,则设置目标敌人 { bullet.Seek(target); } } void OnDrawGizmosSelected() // 在编辑器中显示攻击范围 { Gizmos.color = Color.red; Gizmos.DrawWireSphere(transform.position, range); } } ``` 该代码包含以下要: 1. 使用 `range` 属性定义防御塔攻击范围; 2. 使用 `fireRate` 属性定义防御塔发射速率; 3. 使用 `bulletPrefab` 属性定义子弹预制体; 4. 使用 `target` 变量存储目标敌人; 5. 在 `Update` 方法中,先查找目标敌人,如果有目标敌人则更新发射倒计时并发射子弹; 6. 在 `FindTarget` 方法中,查找所有敌人,找到最近的敌人并设为目标敌人; 7. 在 `Shoot` 方法中,实例化子弹并设置目标敌人; 8. 在 `OnDrawGizmosSelected` 方法中,在编辑器中显示攻击范围。 需要注意的是,该代码仅为示例代码,实际使用中可能需要根据具体需求进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值