實現玩家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狀態不成功,可在系統設置-網絡設置-網