深圳政协委员钟帆飞诈骗30亿

主持正义

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  27 随笔 :: 0 文章 :: 90 评论 :: 56257 阅读

选择一个敌人,按ctrl+d,复制出3个,调整一下它们的位置,不重叠,修改Tag为Enemy,禁用EnemyAI。

创建Targetting脚本,绑定到Player玩家对象

复制代码
public class Targetting : MonoBehaviour {
    public List<Transform> targets;
    public Transform selectedTarget;
    // Use this for initialization
    void Start () {
        targets = new List<Transform> ();
        AddAllEnemies ();
    }

    public void AddAllEnemies(){
        GameObject[] go = GameObject.FindGameObjectsWithTag ("Enemy");
        foreach (GameObject enemy in go) {
            targets.Add(enemy.transform);        
        }
    }

    public void SelectTarget(){
        selectedTarget = targets [0];
    }
    
    // Update is called once per frame
    void Update () {
        if (Input.GetKeyUp (KeyCode.Tab)) {
            SelectTarget ();
        }
    }
}
复制代码

运行查看属性如下

当按Tab时,第一个敌人被获取到SelectedTarget中

下面完善Tab键选敌人功能:

1. 假如已选敌人为null,那么选择最近敌人,并将已选敌人的材质的颜色改为红色。

2. 假如已选敌人不为null,那么按Tab将选择当前已选的下一个敌人(按距离排序),将之前选的敌人颜色改成绿色,新选的改成红色。

3. 在选择敌人完成后,调用Player的PlayerAttack组件,给它的target赋值。完整如下:

复制代码
public class Targetting : MonoBehaviour {
    public List<Transform> targets;
    public Transform selectedTarget;
    public Transform myTransform;
    // Use this for initialization
    void Start () {
        targets = new List<Transform> ();
        AddAllEnemies ();
        myTransform = transform;
    }

    public void AddAllEnemies(){
        GameObject[] go = GameObject.FindGameObjectsWithTag ("Enemy");
        foreach (GameObject enemy in go) {
            targets.Add(enemy.transform);        
        }
    }
    //按距离排序敌人
    public void SortTargetByDistance(){
        targets.Sort (delegate(Transform t1, Transform t2){
            return Vector3.Distance(t1.position,myTransform.position).CompareTo(Vector3.Distance(t2.position, myTransform.position));
        });
    }
  //选择敌人
    public void SelectEnemy(){
        if (selectedTarget == null) {
            SortTargetByDistance ();
            selectedTarget = targets [0];
        } 
        else {
            int index = targets.IndexOf(selectedTarget);
            if(index < targets.Count - 1){
                index++;
            }else{
                index = 0;
            }
       //删除之前选择的敌人 DeleteTarget(); selectedTarget
= targets[index]; }
     //已选择敌人 SelectTarget(); }
private void SelectTarget(){ selectedTarget.renderer.material.color = Color.red;
     //给攻击组件赋值,切换当前攻击的敌人 PlayerAttack pa
= (PlayerAttack)GetComponent ("PlayerAttack"); pa.target = selectedTarget.gameObject; } private void DeleteTarget(){ selectedTarget.renderer.material.color = Color.blue; } // Update is called once per frame void Update () { if (Input.GetKeyUp (KeyCode.Tab)) { SelectEnemy (); } } }
复制代码

 

 

posted on   jayce80  阅读(279)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示