1. 程式人生 > >實現玩家AI

實現玩家AI



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;//使用AI名稱空間
using UnityEngine.UI;//使用UI名稱空間
/// <summary>
/// 玩家角色的AI實現思路:
/// 一.自動導航:
/// 1.需要using UnityEngine.AI
/// 2.需要獲得玩角色身上的導航元件
/// 二、技能釋放:
/// 1.技能對應的按鍵
/// 2.技能對應的圖示(按鈕)
/// 3.按鍵和圖示的統一(按鍵和點選圖示是一致的)
/// 4.技能的釋放、銷燬
/// 5.補兵
/// 三、動畫控制
/// 1.需要獲得角色動畫控制者
/// 2.狀態控制
/// 四實現上述要求的方法:
/// 1.角色狀態控制
/// 2.操作者行為控制(按鍵、點圖示)
/// </summary>
public class WarriorControl : MonoBehaviour
{
    NavMeshAgent nav;//角色導航
    Animator ani;//角色狀態控制者
    GameObject Cav_Skll;//技能按鈕的父物體畫布
    Button Bu_Skill1;//Q技能按鈕
    Button Bu_Skill2;//W技能按鈕
    Image Im_Skill1;//Q技能的Image元件(圖示)
    Image Im_Skill2;//W技能的Image元件(圖示
    float life;//角色生命值
    GameObject skill1;//技能1資源
    GameObject Skill1;//生成的技能1
    GameObject skill2;//技能2資源
    GameObject Skill2;//生成的技能2
    Transform SkillPos;//技能生成的位置
    float sk1time;//技能1的冷卻時間
    float sk2time;//技能2的冷卻時間
    Vector3 TargetPos;//角色導航的下一個位置
    GameObject Cv_P;//角色頭頂血條、姓名的父物體畫布
    Image Im_Blood;//血條

    // Use this for initialization
    void Start()
    {
        //導航獲取
        if (GetComponent<NavMeshAgent>() == null)//如果角色身上沒有導航
        {
            gameObject.AddComponent<NavMeshAgent>();//為角色新增導航
        }
        nav = GetComponent<NavMeshAgent>(); //獲取角色身上導航

        //動畫控制者獲取
        if (GetComponent<Animator>() == null)//如果角色身上沒有導航
        {
            gameObject.AddComponent<Animator>();//為角色新增導航
        }
        ani = GetComponent<Animator>(); //獲取角色身上導航

        //
        Cav_Skll = GameObject.Find("CaV_Skill");
        //技能按鈕
        Bu_Skill1 = Cav_Skll.transform.FindChild("Bu_Skill1").GetComponent<Button>();//獲取技能1按鈕元件
        Bu_Skill1.onClick.AddListener(OnClickBu_Skill1);//響應按鈕1點選事件
        Bu_Skill2 = Cav_Skll.transform.FindChild("But_Skill2").GetComponent<Button>();//獲取技能2按鈕元件
        Bu_Skill2.onClick.AddListener(OnClickBu_Skill2);//響應按鈕2點選事件

        //技能圖示(冷卻)
        Im_Skill1 = Cav_Skll.transform.FindChild("Bu_Skill1").GetComponent<Image>();//Q技能圖示
        Im_Skill2 = Cav_Skll.transform.FindChild("But_Skill2").GetComponent<Image>();//W技能圖示

        //初始化角色生命值
        life = 100;

        //載入技能效果資源
        skill1 = (GameObject)Resources.Load("MagicEffectsPackFree/prefab/skillAttack");
        skill2 = (GameObject)Resources.Load("MagicEffectsPackFree/prefab/skillAttack2");

        //技能產生位置
        SkillPos = transform.FindChild("SkillPos");

        //初始時角色播放發呆的動畫
        ani.Play("Idle");

        //血條、暱稱的父物體畫布
        Cv_P = transform.FindChild("Cv_P").gameObject;

        //血條
        Im_Blood = Cv_P.transform.FindChild("Im_blood").GetComponent<Image>();
    }

    // Update is called once per frame
    void Update()
    {
        AddLifeControl();//呼叫生命值控制函式
        AIControl();//呼叫角色控制函式
        ReleaseSkill();//釋放技能函式
        Im_Blood.fillAmount = life / 100;//血條顯示的血量等於生命值/100
        Cv_P.transform.LookAt(Camera.main.transform.position);//血條、暱稱時刻朝向主相機
    }
    /// <summary>
    /// 技能1按鈕點選事件
    /// </summary>
    void OnClickBu_Skill1()//點選Q技能圖示(和按下Q鍵效果一致)
    {
        if (life > 0)//在角色生命值大於0的情況下
        {
            if (Im_Skill1.fillAmount >= 1)//如果技能1圖示的fillAmount大於等於1
            {
                nav.Stop();//導航暫停
                Im_Skill1.fillAmount = 0;//技能圖示的fillAmount歸零
                ani.Play("Attack1");//播放攻擊1動畫(攻擊1動畫Event添加了回撥函式,動畫快結束時生成技能特效)
            }
        }
    }
    /// <summary>
    /// 技能2按鈕點選事件
    /// </summary>
    void OnClickBu_Skill2()
    {
        if (life > 0)
        {
            if (Im_Skill2.fillAmount >= 1)
            {

                nav.Stop();
                Im_Skill2.fillAmount = 0;
                ani.Play("Attack2");
            }
        }
    }
    /// <summary>
    /// 生命值控制函式1:生命自增
    /// </summary>
    void AddLifeControl()
    {
        if (life < 100&&life>0)//如果生命值小於100大於0
        {
            life += Time.deltaTime * 0.01f;//生命自增
        }
    }
    /// <summary>
    /// 生命值控制函式2:生命減少
    /// </summary>
    public void SubLifeControl(float value)
    {
        life -= value;//生命值減少量
        if (life<=0)//如果生命值小於0
        {
            ani.Play("Death");//播放死亡動畫
            Destroy(gameObject, 1);//1秒後銷燬角色
        }
    }
    /// <summary>
    /// AI(導航)控制
    /// </summary>
    void AIControl()
    {
        if (life > 0)//在生命值大於的前提前下
        {
            if (Input.GetMouseButtonDown(1))//按下滑鼠右鍵
            {
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//從相機發一條射線到滑鼠的右鍵點選點
                RaycastHit hit;
                if (Physics.Raycast(ray, out hit))//如果射線碰到了(檢測到了)點選點
                {
                    if (hit.transform.tag.Equals("terian"))//如果點選點的標籤是terian(地面)
                    {
                        nav.Resume();//導航恢復
                        ani.Play("Run");//播放跑的動畫
                        TargetPos = hit.point;//記錄射線碰撞點(滑鼠點選點)的位置
                        nav.SetDestination(TargetPos);//導航到滑鼠點選點
                    }
                }
            }
            if (nav.remainingDistance <= 0.1f)//如果角色和目標點的距離小於0.1,就認為導航到了目的地
            {
                nav.Stop();//導航暫停
                ani.Play("Idle");//播放發呆動畫
            }
        }
    }
/// <summary>
/// 釋放技能函式
/// </summary>
    void ReleaseSkill()
    {
        if (life<=100&&life>0)//在生命值小於100大於0的前提下
        {
            if (Input.GetKeyDown(KeyCode.Q))//如果按下Q鍵(點選Q技能圖示效果一致)
            {
                print("按下Q鍵");
                if (Im_Skill1.fillAmount >= 1)
                {
                    nav.Stop();
                    Im_Skill1.fillAmount = 0;
                    ani.Play("Attack1");
                    print("釋放Q技能");
                }
            }

            if (Input.GetKeyDown(KeyCode.W))
            {
                if (Im_Skill2.fillAmount >= 1)
                {

                    nav.Stop();
                    Im_Skill2.fillAmount = 0;
                    ani.Play("Attack2");
                }
            }

            //兩個技能圖示的冷卻顯示
            if (Im_Skill1.fillAmount <= 1)//如果技能1圖示的fillAmount小於等於1
            {
                Im_Skill1.fillAmount += Time.deltaTime;//技能1圖示的fillAmount自增(1秒就冷卻完畢)
            }
            if (Im_Skill2.fillAmount <= 1)
            {
                Im_Skill2.fillAmount += Time.deltaTime / 3;//3秒冷卻完畢
            }
        }
      
    }
    /// <summary>
    /// 兩個技能動畫的回撥函式
    /// </summary>
    void OnAttack1End()//攻擊1動畫的Event回撥函式
    {
        Skill1 = Instantiate(skill1, SkillPos.position, SkillPos.rotation);//在技能生成點生成技能1
        Destroy(Skill1, 1);//一秒後銷燬技能1
        ani.Play("Idle");//播放發呆動畫
    }
    void OnAttack2End()
    {
        Skill2 = Instantiate(skill2, SkillPos.position, SkillPos.rotation);
        Destroy(Skill2, 1);
        ani.Play("Idle");
    }
}

相關推薦

實現玩家AI

 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI;//使用AI名稱空間 using UnityEngine.UI;//

使用行為樹(Behavior Tree)實現遊戲AI

方便 不同 sequence 理解 and while 記錄 策略 積累 談到遊戲AI,很明顯智能體擁有的知識條目越多,便顯得更智能,但維護龐大數量的知識條目是個噩夢:使用有限狀態機(FSM),分層有限狀態機(HFSM),決策樹(Decision Tree)來實現遊戲AI總

State+Bridge實現角色AI

image log 實現 方法 img ridge uml類圖 ont pos   運用狀態模式和橋接模式實現角色的AI,使控制和狀態能夠分別獨立變化, 這裏狀態的切換由兩種思路:   1.放在Controller中進行切換   2.放在各個狀態狀態之中進行切換,只不過是調

用50行Python程式碼從零開始實現一個AI平衡小遊戲!

集智導讀: 本文會為大家展示機器學習專家 Mike Shi 如何用 50 行 Python 程式碼建立一個 AI,使用增強學習技術,玩耍一個保持杆子平衡的小遊戲。所用環境為標準的 OpenAI Gym,只使用 Numpy 來建立 agent。 學習Python中有不明白推薦加入交流群號

用C語言寫一個簡單的三子棋,實現玩家與電腦的對戰

原始碼: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <windows.h> #include <time.h> /* 用 C 寫一個三子棋 */ //邏輯: //1. 畫

(Tensorflow1.0)強化學習實現遊戲AI(Demo_1)

http://blog.topspeedsnail.com/archives/10459在學習完這篇文章好,打算循序漸進的實現俄羅斯方塊AI和鬥地主AI,並且突破DQN,使用對抗神經網路來實現更強大的AI下面程式碼實現的是上面部落格的程式,發現了tensorflow1.0後

貪吃蛇 AI實現 snake AI

1.首先看下這個非常在微博上很火的貪吃蛇gif 這次我們嘗試用程式碼來模擬下,說不定上面這個圖就是計算機搞的。 2.講貪吃蛇AI之前,我們先看下貪吃蛇移動的特點 物理上給人的感覺是整個貪吃蛇往右移了一步,在貪吃蛇非常長的情況下給人的感覺移一步要做很多事情。但是在計

如何實現文章AI偽原創?

# language-ai 文章AI偽原創,文章自動生成,NLP,自然語言技術處理,DNN語言模型,詞義相似度分析。全網首個AI偽原創開源應用類專案。 點選右側about內的連結極速體驗! 程式碼託管在github,需要的可以自取:https://github.com/LovebuildJ/language

實現敵人(怪物)的簡單AI(自動巡邏、看到玩家攻擊玩家玩家離開恢復自動巡邏)

 using UnityEngine; using UnityEngine.AI; /// <summary> /// 敵人自動巡邏 /// </summary> public class EnemyMove : MonoBehaviour {

AI實現五子棋機器人(一)

而是 fec 指定 pie soft lis href 遊戲 bsp 前言:   前幾天在 csdn 下載資源的時候才發現自己 csdn 有近 200 的下載積分,看了看共享的資源,哈哈 ... 7年前寫的五子棋遊戲很受歡迎。   下載地址:新手入門五子棋遊戲

[深度學習]實現一個博弈型的AI,從五子棋開始(1)

com class svm 顏色 display 深度 images += have 好久沒有寫過博客了,多久,大概8年???最近重新把寫作這事兒撿起來……最近在折騰AI,寫個AI相關的給團隊的小夥伴們看吧。 搞了這麽多年的機器學習,從分

如何用 AI 實現視頻結構化管理?

視頻繼圖片之後,視頻結構化成為了深度學習領域又一個熱點。相比圖片,視頻內容無疑具有更大的復雜性。面對不同場景的視頻結構化需求,需要采用什麽策略才能取得最大化的效果? AI 視頻結構化對於互聯網、廣電等行業的變革又有什麽樣的價值? 在 4 月 20 日 QCon 全球軟件開發大會上,七牛雲人工智能實驗室首席架構

AI人工智能編輯,人工智能編輯機器人到底是如何實現無人編輯的

人工智能編輯 人工智能編輯機器人 人工智能編輯是如何實現無人編輯的 編輯機器人就是通過AI技術來智能化提供文本的分類、分詞、關鍵詞提取等工作,極大提高文本處理效率。 智能化的資訊頻道定制服務專家,無需人工編輯,資訊內容自動化生成。 助力資訊運營“無人化編輯”,實現內容的7*24小時實時更新,是企業內容

快播畫上句號,王欣轉身區塊鏈和AI,能否實現王者歸來?

同城 自動駕駛汽車 人脈 獲得 消息 江湖 好友 情懷 騰訊 王欣出獄後的第7個月,快播破產了。9月3日,深圳市中級人民法院一份裁定顯示,快播的破產清算申請生效,這意味著,快播時代終於畫上了句號,作為一代人的回憶,快播終究帶著情懷走到了窮途末路。但使得給更多人好奇的問題是:

project師聊AI芯片—談算法不談智能,談實現不談芯片!

verilog dbf 分享圖片 也有 清醒 b16 mil tde 性能 版權聲明:本文為博主原創文章,未經博主同意不得轉載。 https://blog.csdn.net/DP29syM41zyGndVF/article/detail

Python——百度AI影象識別API實現動物識別

摘要:百度AI的文件中心是Python2寫的示例程式碼,我的是Python3,之間遇到一些問題,主要是字串的編碼問題,後面有總結。以下是修改之後的Python3 示例程式碼 一、獲取access_token示例程式碼 import urllib.request # client_id

把虛擬教練帶回家,「EuMotus」想用AI實現高精度運動反饋系統

https://36kr.com/p/5089139.html 無需穿戴裝置,只需一個紅外攝像頭和+已安裝好EuMotus專利軟體的手提電腦 由政府主導的高達2200億美金的健身與運動支出,15%的健身俱樂部年增長率,46%的中國年輕人正在使用健身器材與健身軟體。這是美國IBIS此前釋出的關於中國體

UE4 第一人稱射擊製作流程:09(圖文)讓AI機器人動起來,跟隨玩家跑動

上面已經把帶有動畫的Robot_Character,製作好了,接下來讓其動起來; 1、操作如下圖,搜尋NAV,將自動尋路的網格界限體積(Nav Mesh Bounds Volume)拖入場景,然後通過調整檢視,將大小調整如圖: 2、調整好後,可以選中Nav Mesh Bounds Vo

AI智慧人機對戰五子棋(Java實現圖形介面)

簡述 這是本學期上完Java課後老師給出的課程設計題目,目的是:熟悉與掌握GUI程式設計;實現五子棋棋盤和棋子的繪製;實現遊戲AI以及對二維陣列的使用。 介面效果圖 電腦先行,玩家輸贏圖: 玩家先行,玩家輸贏圖: 整體設計 介面設

巨峰科技AI警戒一體機聯動NVR實現微信報警推送

證明 shadow strong 一體機 手機 外網 網絡測試 移動 信息 一、NVR設置過程 ①確保NVR連接到外網,如何判斷是否外網連接正常?系統信息-版本信息查看NET狀態,NET狀態顯示連接成功,證明設備正常連接外網。(若NET狀態不成功,可在系統設置-網絡設置-網