【制作100個unity游戲之26】unity2d橫版卷軸動作類游戲6(附帶項目源碼)

最終效果

在這里插入圖片描述

系列導航

文章目錄

  • 最終效果
  • 系列導航
  • 前言
  • 敵人
    • 動畫配置
    • 撞墻判斷
    • 敵人基本AI邏輯實現
  • 野豬受傷死亡
  • 死亡
  • 敵人死亡時,還是會對人物產生傷害
  • 有限狀態機&抽象類多態 定義不同狀態的敵人行為
  • 防止野豬在懸崖掉下去
  • 野豬的追擊狀態的轉換
    • 敵人主動查找玩家
  • 追擊狀態
    • 效果
  • 完善追擊狀態腳本
    • 追擊狀態 修改速度 播放奔跑動畫 敵人碰壁直接轉向不等待
    • 野豬丟失目標,一段時間后回到默認狀態
  • 野豬朝我們沖鋒時,正面受到攻擊 無法擊退 背面受到攻擊又會擊退很遠
  • 制作多個敵人
  • 源碼
  • 完結

前言

歡迎來到【制作100個Unity游戲】系列!本系列將引導您一步步學習如何使用Unity開發各種類型的游戲。在這第26篇中,我們將探索如何用unity制作一個unity2d橫版卷軸動作類游戲,我會附帶項目源碼,以便你更好理解它。

本節主要是完善敵人AI,動畫,有限狀態機控制敵人狀態切換,制作多個敵人

敵人

動畫配置

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

撞墻判斷

修改PhysicsCheck ,地面檢測和撞墻判斷

public class PhysicsCheck : MonoBehaviour
{public Vector2 bottomOffset;// 檢測圓形底部偏移量public float checkRadius; // 圓形檢測半徑public LayerMask groundLayer; // 地面圖層public bool isGround; // 是否在地面上private Vector2 leftOffset;private Vector2 rightOffset;public bool touchLeftWall;//是否接觸到左墻壁public bool touchRightWall;//是否接觸到右墻壁private CapsuleCollider2D coll;public bool manual; //是否手動配置private void Awake() {coll = GetComponent<CapsuleCollider2D>();//如果不是手動配置偏移量,則根據 Collider 的位置和大小計算左右偏移量if(!manual){Vector2 collPos = coll.offset * (Vector2)transform.localScale;rightOffset = new Vector2(collPos.x + coll.size.x / 2 + checkRadius, coll.size.y / 2);leftOffset = new Vector2(collPos.x - coll.size.x / 2 - checkRadius, coll.size.y / 2);}}private void Update(){//根據物體的 x 軸縮放來更新偏移量Check();}private void FixedUpdate() {UpdateOffset(transform.localScale.x);}private void UpdateOffset(float facedir){// 根據物體的 x 軸縮放更新左右偏移量if(!manual){Vector2 collPos = coll.offset * facedir;rightOffset = new Vector2(collPos.x + coll.size.x / 2 + checkRadius, coll.size.y / 2);leftOffset = new Vector2(collPos.x - coll.size.x / 2 - checkRadius, coll.size.y / 2);}else{leftOffset = leftOffset * facedir;rightOffset = rightOffset * facedir;}}public void Check(){// 檢測是否在地面上isGround = Physics2D.OverlapCircle(transform.position + bottomOffset, checkRadius, groundLayer);//墻壁判斷touchLeftWall = Physics2D.OverlapCircle((Vector2)transform.position + leftOffset, checkRadius, groundLayer);touchRightWall = Physics2D.OverlapCircle((Vector2)transform.position + rightOffset, checkRadius, groundLayer);}private void OnDrawGizmosSelected(){// 在 Scene 視圖中繪制檢測范圍Gizmos.DrawWireSphere((Vector2)transform.position + bottomOffset, checkRadius);Gizmos.DrawWireSphere((Vector2)transform.position + leftOffset, checkRadius);Gizmos.DrawWireSphere((Vector2)transform.position + rightOffset, checkRadius);}
}

配置
在這里插入圖片描述
運行效果,程序會自動找到碰撞體的位置
在這里插入圖片描述
前面設置了地面碰撞體復合,只有外框才是碰撞區域,如果敵人快速通過可能檢測不到墻壁。可以修改為瓦片地圖碰撞幾何類型為Polygons,將瓦片地圖全部做為一個碰撞體整體。
在這里插入圖片描述

敵人基本AI邏輯實現

新增Enemy代碼 ,控制敵人基本移動和動畫,碰壁等待一段時間,再回頭

public class Enemy : MonoBehaviour
{Rigidbody2D rb;protected Animator anim;private PhysicsCheck physicsCheck;[Header("基本參數")]public float normalSpeed; // 常規速度public float chaseSpeed; // 追逐速度public float currentSpeed; // 當前速度public Vector3 faceDir; // 面向方向public bool wait;//是否等待public float waitTime;//等待時長private void Awake(){rb = GetComponent<Rigidbody2D>();anim = GetComponent<Animator>();physicsCheck = GetComponent<PhysicsCheck>();currentSpeed = normalSpeed;}private void Update(){//面向方向 默認右邊為正方向faceDir = new Vector3(-transform.localScale.x, 0, 0);//按敵人面向和撞墻 切換敵人狀態if((physicsCheck.touchLeftWall && faceDir.x < 0  || physicsCheck.touchRightWall && faceDir.x > 0) && !wait){wait = true; // 設為等待狀態anim.SetBool("walk", false);//禁止走路動畫StartCoroutine(WaitTimer()); // 啟動等待計時}}private void FixedUpdate(){if(!wait) Move();}//移動方法public virtual void Move(){anim.SetBool("walk", true);//播放走路動畫rb.velocity = new Vector2(currentSpeed * faceDir.x * Time.deltaTime, rb.velocity.y);}//等待計時攜程private IEnumerator WaitTimer(){yield return new WaitForSeconds(waitTime); // 等待時間transform.localScale = new Vector3(faceDir.x, transform.localScale.y, transform.localScale.z);//轉向wait = false; // 取消等待狀態}
}

配置
在這里插入圖片描述

效果
在這里插入圖片描述

野豬受傷死亡

切割圖片,圖片沒有死亡動畫,這里可以選擇使用和受傷一樣的動畫
在這里插入圖片描述
修改死亡動畫多一個漸變消失
在這里插入圖片描述
受傷和完整播放完受傷動畫退出
在這里插入圖片描述
在這里插入圖片描述

死亡
在這里插入圖片描述

修改Enemy,實現受傷面向玩家,

public bool isHurt;//是否受傷
public float hurtForce;//擊退力
public float waitHitTime = 0.5f;//受傷時長private void FixedUpdate()
{if(!wait && !isHurt) Move();
}//受傷
public void OnTakeDamage(Transform attackTrans){// attacker = attackTrans;isHurt = true;anim.SetTrigger("hit");//轉身面向攻擊者if (attackTrans.position.x - transform.position.x > 0)transform.localScale = new Vector3(-Mathf.Abs(transform.localScale.x),transform.localScale.y,transform.localScale.z);if (attackTrans.position.x - transform.position.x < 0)transform.localScale = new Vector3(Mathf.Abs(transform.localScale.x),transform.localScale.y,transform.localScale.z);//受傷被擊退Vector2 dir = new Vector2(transform.position.x - attackTrans.position.x, 0).normalized;rb.AddForce(dir * hurtForce, ForceMode2D.Impulse);//等待切換回正常狀態StartCoroutine(OnWaitHit());
}//等待切換回正常狀態
private IEnumerator OnWaitHit()
{yield return new WaitForSeconds(waitHitTime);isHurt = false;
}

修改配置
在這里插入圖片描述

配置受傷事件
在這里插入圖片描述

效果
在這里插入圖片描述

死亡

修改Enemy

public bool isDead;//是否死亡private void FixedUpdate()
{if(!wait && !isHurt && !isDead) Move();
}//死亡
public void OnDead(){isDead = true;anim.SetBool("isDead", true);//銷毀StartCoroutine(OnDeadDestroy());
}private IEnumerator OnDeadDestroy()
{yield return new WaitForSeconds(1f);Destroy(gameObject);
}

配置
在這里插入圖片描述
效果
在這里插入圖片描述

敵人死亡時,還是會對人物產生傷害

取消玩家和Ignore Raycast的碰撞
在這里插入圖片描述

修改Enemy,死亡修改圖層

//死亡
public void OnDead(){gameObject.layer = 2;//修改圖層,避免敵人死亡時,還是會對人物產生傷害isDead = true;anim.SetBool("isDead", true);//銷毀StartCoroutine(OnDeadDestroy());
}

效果
在這里插入圖片描述

有限狀態機&抽象類多態 定義不同狀態的敵人行為

新增一個抽象基類,定義了所有狀態類的基本結構。包括進入狀態、邏輯更新、物理更新和退出狀態等方法。

public abstract class BaseState
{protected Enemy currentEnemy; // 當前敵人public abstract void OnEnter(Enemy enemy); // 進入狀態時的方法public abstract void LogicUpdate(); // 邏輯更新方法public abstract void PhysicsUpdate(); // 物理更新方法public abstract void OnExit(); // 退出狀態時的方法
}

新增BoarPatrolState,這是野豬的巡邏狀態類,繼承自BaseState類,并實現了具體的狀態行為。

  • 在OnEnter方法中,初始化當前敵人(野豬)對象。
  • LogicUpdate方法中,根據敵人面朝方向和是否撞墻來切換敵人狀態。
  • PhysicsUpdate方法中,執行物理更新的邏輯。
  • OnExit方法中,處理退出狀態時的邏輯。
public class BoarPatrolState : BaseState
{public override void OnEnter(Enemy enemy){currentEnemy = enemy;}public override void LogicUpdate(){//按敵人面向和撞墻 切換敵人狀態if (currentEnemy.physicsCheck.touchLeftWall && currentEnemy.faceDir.x < 0 || currentEnemy.physicsCheck.touchRightWall && currentEnemy.faceDir.x > 0){currentEnemy.wait = true; // 設為等待狀態currentEnemy.anim.SetBool("walk", false);//禁止走路動畫}}public override void PhysicsUpdate(){}public override void OnExit(){currentEnemy.anim.SetBool("walk", false);}
}

修改Enemy類,作為所有敵人的父類,這個類表示敵人的基本行為,包括移動、受傷、死亡等。使用了狀態機模式來管理敵人的狀態,包括巡邏狀態和追逐狀態。在Update和FixedUpdate方法中,通過當前狀態對象來執行邏輯更新和物理更新。

public bool isWaitTimer;//是否開始等待計時[Header("狀態機")]
private BaseState currentState;// 當前狀態
protected BaseState patrolState;// 巡邏狀態
protected BaseState ChaseState;// 追逐狀態//...private void OnEnable()
{currentState = patrolState;currentState.OnEnter(this);
}private void Update()
{//面向方向 默認右邊為正方向faceDir = new Vector3(-transform.localScale.x, 0, 0);currentState.LogicUpdate();}private void FixedUpdate()
{if (!wait && !isHurt && !isDead) Move();currentState.PhysicsUpdate();if (wait && !isWaitTimer){isWaitTimer = true;StartCoroutine(WaitTimer()); // 啟動等待計時}
}private void OnDisable()
{currentState.OnExit();
}//...

新增Boar,繼承自Enemy類,表示野豬這種特定類型的敵人。在Awake方法中初始化了野豬的巡邏狀態。

public class Boar : Enemy {protected override void Awake() {base.Awake();patrolState = new BoarPatrolState();// 設置野豬的巡邏狀態}
}

野豬敵人,重新掛載Boar腳本,而不是之前的Enemy ,記得Character的受傷死亡事件也要重新配置
在這里插入圖片描述

運行,看看程序是否能跑通
在這里插入圖片描述

防止野豬在懸崖掉下去

修改BoarPatrolState,我們直接用腳底地面檢測來判斷,野豬前方沒有地面(即是懸崖),等待回頭即可

public override void LogicUpdate()
{//按敵人面向和撞墻切換敵人狀態if (!currentEnemy.physicsCheck.isGround|| currentEnemy.physicsCheck.touchLeftWall && currentEnemy.faceDir.x < 0|| currentEnemy.physicsCheck.touchRightWall && currentEnemy.faceDir.x > 0){currentEnemy.wait = true; // 設為等待狀態currentEnemy.anim.SetBool("walk", false);//禁止走路動畫}else{currentEnemy.wait = false;currentEnemy.anim.SetBool("walk", true);//播放走路動畫}
}

修改PhysicsCheck,也就是地面檢測多一個* transform.localScale.x,確保敵人轉向時,地面檢點也跟著偏過去

在這里插入圖片描述
記得修改檢測偏移到野豬頭的前面位置
在這里插入圖片描述
效果
請添加圖片描述

野豬的追擊狀態的轉換

敵人主動查找玩家

修改Enemy,原理就是向前發射一個方塊檢測玩家

[Header("主動發現玩家檢測")]
public Vector2 centerOffset;//檢測框的中心偏移量
public Vector2 checkSize;//檢測框的尺寸
public float checkDistance;//檢測的距離
public LayerMask attackLayer;//檢測圖層//發現玩家
public bool FoundPlayer()
{return Physics2D.BoxCast(transform.position + (Vector3)centerOffset, checkSize, 0, faceDir, checkDistance, attackLayer);
}//在場景顯示檢查距離
private void OnDrawGizmosSelected()
{Gizmos.color = Color.red; // 設置繪制顏色為黃色,你可以根據需要選擇其他顏色Gizmos.DrawWireCube(transform.position + (Vector3)centerOffset + new Vector3(-transform.localScale.x * checkDistance, 0, 0), checkSize); // 繪制一個邊框的立方體表示檢測區域
}

配置
在這里插入圖片描述

追擊狀態

前面我們已經創建了野豬的巡邏狀態腳本BoarPatrolState,我們同理再創建一個追擊狀態腳本即可

新增BoarChaseState,定義野豬追擊狀態

public class BoarChaseState : BaseState
{public override void OnEnter(Enemy enemy){currentEnemy = enemy;}public override void LogicUpdate(){}public override void PhysicsUpdate(){}public override void OnExit(){}
}

修改Boar ,賦值野豬追擊狀態

public class Boar : Enemy {protected override void Awake() {base.Awake();patrolState = new BoarPatrolState();// 設置野豬的巡邏狀態chaseState = new BoarChaseState();// 設置野豬的追擊狀態}
}

新增枚舉,定義敵人不同的狀態

public enum EnemyState
{Patrol, Chase, Skill
}

修改Enemy,定義切換敵人狀態,方法

//切換敵人狀態
public void SwitchState(EnemyState state)
{var newState = state switch{EnemyState.Patrol => patrolState,EnemyState.Chase => chaseState,_ => null};currentState.OnExit();//退出上一個狀態currentState = newState; //賦值新狀態currentState.OnEnter(this);//開始新的狀態
}

修改BoarPatrolState,發現玩家切換野豬為追擊狀態

public override void LogicUpdate()
{if(currentEnemy.FoundPlayer()){Debug.Log("發現玩家");currentEnemy.SwitchState(EnemyState.Chase);}//...
}

效果

在這里插入圖片描述

完善追擊狀態腳本

追擊狀態 修改速度 播放奔跑動畫 敵人碰壁直接轉向不等待

修改BoarChaseState

public class BoarChaseState : BaseState
{public override void OnEnter(Enemy enemy){currentEnemy = enemy;currentEnemy.currentSpeed = currentEnemy.chaseSpeed;//追擊速度currentEnemy.anim.SetBool("run", true);//奔跑動畫}public override void LogicUpdate(){// 如果超過等待時間,切換為默認巡邏狀態if (currentEnemy.timeSincePlayerLost >= currentEnemy.maxTimeWithoutPlayer){currentEnemy.SwitchState(EnemyState.Patrol);}//按敵人 是否在懸崖邊 面向和撞墻 切換敵人狀態if (!currentEnemy.physicsCheck.isGround|| currentEnemy.physicsCheck.touchLeftWall && currentEnemy.faceDir.x < 0|| currentEnemy.physicsCheck.touchRightWall && currentEnemy.faceDir.x > 0){currentEnemy.transform.localScale = new Vector3(currentEnemy.faceDir.x, currentEnemy.transform.localScale.y, currentEnemy.transform.localScale.z);//轉向}}public override void PhysicsUpdate(){}public override void OnExit(){currentEnemy.anim.SetBool("run", false);}
}

野豬丟失目標,一段時間后回到默認狀態

修改Enemy

[Header("丟失目標計時器參數")]
public float lostTimeCounter = 0f;//計時器
public float lostTime = 2f; // 丟失目標時間private void FixedUpdate()
{//...//計時器Timer();
}//追擊計時器
private void Timer()
{// 如果發現玩家,則重置計時器if (FoundPlayer()){lostTimeCounter = 0f;}else{if (lostTimeCounter >= lostTime){lostTimeCounter = lostTime;}else{lostTimeCounter += Time.deltaTime;}}
}

修改BoarChaseState

public override void LogicUpdate()
{// 如果超過等待時間,切換為默認巡邏狀態if (currentEnemy.lostTimeCounter >= currentEnemy.lostTime){currentEnemy.SwitchState(EnemyState.Patrol);}//...}

修改BoarPatrolState,速度改回默認速度

public override void OnEnter(Enemy enemy)
{currentEnemy = enemy;currentEnemy.currentSpeed = currentEnemy.normalSpeed;
}

配置丟失目標時間
在這里插入圖片描述
效果
在這里插入圖片描述

野豬朝我們沖鋒時,正面受到攻擊 無法擊退 背面受到攻擊又會擊退很遠

因為沖鋒的力也有一個向前的力

修改Enemy ,擊退前先把敵人x軸的力停下來

//受傷
public void OnTakeDamage(Transform attackTrans)
{// 。。。//受傷被擊退Vector2 dir = new Vector2(transform.position.x - attackTrans.position.x, 0).normalized;rb.velocity = new Vector2(0, rb.velocity.y);//先取消剛體x軸的力rb.AddForce(dir * hurtForce, ForceMode2D.Impulse);//等待切換回正常狀態StartCoroutine(OnWaitHit());
}

效果
在這里插入圖片描述

制作多個敵人

制作多個敵人可以參考前面的方法,繼承Enemy,重新定義各種狀態即可,比如巡邏狀態,追擊狀態

源碼

源碼不出意外的話我會放在最后一節

完結

贈人玫瑰,手有余香!如果文章內容對你有所幫助,請不要吝嗇你的點贊評論和關注,以便我第一時間收到反饋,你的每一次支持都是我不斷創作的最大動力。當然如果你發現了文章中存在錯誤或者有更好的解決方法,也歡迎評論私信告訴我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奮斗的開發者,出于興趣愛好,最近開始自學unity,閑暇之余,邊學習邊記錄分享,站在巨人的肩膀上,通過學習前輩們的經驗總是會給我很多幫助和啟發!php是工作,unity是生活!如果你遇到任何問題,也歡迎你評論私信找我, 雖然有些問題我也不一定會,但是我會查閱各方資料,爭取給出最好的建議,希望可以幫助更多想學編程的人,共勉~

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13259.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13259.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13259.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于微信小程序+JAVA Springboot 實現的【智慧鄉村旅游服務平臺】app+后臺管理系統 (內附設計LW + PPT+ 源碼+ 演示視頻 下載)

項目名稱 項目名稱&#xff1a; 基于微信小程序的智慧鄉村旅游服務平臺的設計與實現 項目技術棧 該項目采用了以下核心技術棧&#xff1a; 后端框架/庫&#xff1a; Java SSM框架數據庫&#xff1a; MySQL前端技術&#xff1a; 微信開發者工具、uni-app其他技術&#xff1a…

8B10B編碼(高速收發器五)

1、8B10B解決的問題 8B10B編碼是1983年IBM公司提出的傳輸編碼標準&#xff0c;通常用于高速收發器中&#xff0c;常見的JESD204B、SATA等接口協議&#xff0c;使用查表就可以實現編碼和解碼。 在這些高速收發器的接收端需要通過CDR技術去恢復時鐘與數據的相位關系&#xff0c;在…

Linux day6 yum下載,systemctl,

yum命令 yum [-y] install wget 通過yum下載wget小工具 -y的意思是&#xff0c;如果有詢問&#xff0c;自動確認&#xff08;總是允許&#xff09;。 yum remove wget 也可以通過這種方式卸載wget

Git版本控制工具的原理及應用詳解(四)

本系列文章簡介&#xff1a; 隨著軟件開發的復雜性不斷增加&#xff0c;版本控制成為了開發團隊中不可或缺的工具之一。在過去的幾十年里&#xff0c;版本控制工具經歷了各種發展和演變&#xff0c;其中Git無疑是目前最受歡迎和廣泛應用的版本控制工具之一。 Git的出現為開發者…

Apache Flink典型應用場景全面解析

Apache Flink作為一個高度靈活且功能強大的開源流處理框架&#xff0c;因其在實時數據處理、大規模數據分析以及事件驅動應用方面的卓越表現而受到廣泛青睞。以下是Flink幾個典型的使用場景&#xff0c;展示了其在不同行業和業務需求中的應用潛力。 實時數據分析與監控 應用描述…

工作小記2——二周年記

不知不覺&#xff0c;工作已經有二周年&#xff0c; 由于公司電腦不能登錄csdn&#xff0c;不能登github&#xff0c;我已經好久沒有碰過我的個人博客空間啦。現在從大廠跳到小公司&#xff0c;舒適度翻倍提升&#xff01;現在我要回歸CSDN啦&#xff01; 總體感受&#xff1a…

playwright 自動化框架python教程(九)

Playwright 提供了一系列API來處理各種瀏覽器中的特殊操作 Playwright 提供了一系列API來處理各種瀏覽器中的特殊操作&#xff0c;包括彈窗&#xff08;如alert、confirm、prompt&#xff09;、新窗口的打開與管理&#xff0c;以及其他一些高級交互。以下是處理這些情況的一些…

Solon Cloud Event 新的事務特性與應用

1、Solon Cloud Event&#xff1f; 是 Solon 分布式事件總線的解決方案。也是 Solon “最終一致性”分布式事務的解決方案之一2、事務特性 事務&#xff1f;就是要求 Event 有原子性&#xff0c;當多個 Event 發布時&#xff0c;要么全成功&#xff0c;要么全失敗。 public …

PyQt5 中的 List View

文章目錄 1. 基礎概念2. 創建 List View2.1 PyQt5 中一個簡單的 List View 實例2.2 代碼解釋2.3 運行結果 3. 數據模型3.1 標準模型3.2 自定義模型 4. 自定義 List View4.1 使用樣式表 (QSS)4.2 設置項委托 (Item Delegate) 5.事件處理6. 與數據交互6.1 添加數據6.2 刪除數據6.…

【哈希】Leetcode 205. 同構字符串【簡單】

同構字符串 給定兩個字符串 s 和 t &#xff0c;判斷它們是否是同構的。 如果 s 中的字符可以按某種映射關系替換得到 t &#xff0c;那么這兩個字符串是同構的。 每個出現的字符都應當映射到另一個字符&#xff0c;同時不改變字符的順序。不同字符不能映射到同一個字符上&am…

如何解決 Scrapy 下載圖片時的文件名錯誤問題

在使用 Scrapy 的 ImagesPipeline 下載圖片時&#xff0c;有時會遇到因為文件名的問題導致下載失敗的情況。本文將詳細解釋這種錯誤的原因&#xff0c;并提供一個簡單易懂的解決方案&#xff0c;幫助大家避免類似的問題。 問題描述 在下載圖片時&#xff0c;如果圖片的名字是…

C語言到底怎么學?

C語言到底怎么學&#xff1f; 1、工欲善其事&#xff0c;必先利其器 這里介紹幾個華清遠見學習C語言必備的工具: VMware、ubuntu。 VMware是一家提供虛擬化軟件和解決方案的公司&#xff0c;VMware的旗艦產品是VMware Workstation&#xff0c;這是一種虛擬機軟件&#xff0c;…

echers配置項:數據過多時,折疊數據縮放查看

當數據過多時&#xff0c;如上圖所示的時間點&#xff0c;會自動折疊&#xff0c;此時鼠標縮放還不起作用&#xff0c;我們配置如下代碼 let option {dataZoom: [{startValue: 05:00}, // 這個值需要跟 第一條 時間數據對應上{type: inside}], }配置后&#xff0c;就可以進行…

echers配置項:折線圖,折現的顏色修改

如上圖所示&#xff1a;紅框內的折現顏色修改&#xff0c;并隱藏默認的點 series: [{data: [1, 230, 224, 218, 135, 147, 760,1500,1200,2500,2000],type: line,lineStyle: {color: #00DBFE // 折現顏色},symbol:none, // 不顯示點smooth: true, // 折現角度&#xff1a;圓滑…

hadoop生態圈集群搭建(持續更新240513)

Hadoop生態圈 Linux1.修改ip地址2.重啟network服務3.安裝插件4.關閉防火墻5.創建用戶6.創建目錄7.修改目錄的所屬主和所屬組為lxy8.修改主機名:hadoop102 (注意名字后面不要加空格)9.修改hosts文件10.等插件都裝完后再重啟Linux11.把xshell的登錄用戶換成lxy &#xff08;注意&…

5W 3KVAC隔離 寬電壓輸入 AC/DC 電源模塊——TP05AL系列

TP05AL系列產品是一款經濟型開板式開關電源&#xff0c;輸出功率為5W&#xff0c;具有可靠性高、小體積、性價比高等特點&#xff0c;廣泛用于工控和電力儀器、儀表、智能家居等相關行業。

通過 Apple Vision Pro 釋放創造力:深入研究空間計算

Apple 最新進軍空間計算領域的 Apple Vision Pro,標志著重新定義我們與技術交互方式的重大飛躍。空間計算超越了傳統界限,允許用戶以無縫集成到物理世界的方式參與 2D 和 3D 內容。 我們可以關注兩種類型的體驗: 在空間中渲染 2D 內容。這涉及將現有設備窗口投影到空間領域…

通過C++和libcurl下載網易云音樂音頻文件的5個簡單步驟

概述 在網絡編程中&#xff0c;使用C和libcurl庫下載文件是一項常見的任務。網易云音樂作為中國領先的在線音樂服務平臺之一&#xff0c;以其豐富的音樂資源、優質的音質和智能推薦系統而廣受歡迎。由于其平臺提供了大量的正版音樂資源&#xff0c;用戶在下載音頻文件時可能會…

開源發布:JAVA版低代碼報文網關-通過簡單配置快速對接銀行渠道

大家好&#xff0c;我是隱墨星辰&#xff0c;自從《百圖解碼支付系統設計與實現》專欄中的文章《圖解支付報文網關&#xff1a;一種低代碼報文網關的設計思路與核心代碼實現》發表以來&#xff0c;不少同學留言或私信問我如何實現&#xff0c;說是雖然看懂了思路&#xff0c;但…

pycharm 里面安裝 codeium 插件的時候,不能夠彈出登錄界面

pycharm 里面安裝 codeium 插件的時候&#xff0c;不能夠彈出登錄界面 pycharm 里面安裝 codeium 插件的時候&#xff0c;不能夠彈出登錄界面--解決如下A pycharm 里面安裝 codeium 插件的時候&#xff0c;不能夠彈出登錄界面–解決如下 #踩坑/pycharm/codeium插件無法登錄 安…