學習游戲制作記錄(劍投擲技能)7.26

1.實現瞄準狀態和接劍狀態

準備好瞄準動畫,投擲動畫和接劍動畫,并設置參數AimSword和CatchSword

投擲動畫在瞄準動畫后,瞄準結束后才能投擲

創建PlayerAimSwordState腳本和PlayerCatchSwordState腳本并在Player中初始化:

PlayerAimSwordState腳本:

? ? ? ? if(Input.GetKeyDown(KeyCode.Mouse1))//鼠標右鍵
{
_PlayerStateMachine.ChangeState(_Player.idleState);
}//在Update中,用于調試

PlayerGroundedState腳本:

? ? ? ? if(Input.GetKeyDown(KeyCode.Mouse1))
{
_PlayerStateMachine.ChangeState(_Player.AimSword);
}

為SkillManage對象創建新腳本Sword_Skil并在SkillManage腳本中初始化它:

? ? [Header("Skill info")]
[SerializeField] private GameObject swordPrefab;//劍的預制體
[SerializeField] private Vector2 lanchForce;//劍的發射方向
[SerializeField] private float swordGravity;//劍的重力改變

2.實現劍的投擲(劍預制體的創建與代碼調用)

創建劍的對象,你可以創建一個父對象和子對象來表示一把劍,子對象負責掛載動畫組件,父對象負責掛載剛體碰撞器等。

為其添加旋轉和待機動畫,并添加rotation參數用來控制動畫

Skill腳本:

? ? protected Player player { get; private set; }//實例化Player,方便調用


? ? protected virtual void Start()
{
player = PlayerManage.instance.player;
}

為劍預制體添加Sword_Skill_Control腳本:

? ? private Animator anim;
private Rigidbody2D rb;
private CircleCollider2D cd;

? ? private Player player;

? ? private void Awake()
{
anim = GetComponent<Animator>();
rb = GetComponent<Rigidbody2D>();?
cd = GetComponent<CircleCollider2D>();

}

? ? public void SetupSword(Vector2 _dir,float _gravityScale)//給生成的預制體一個力和重力的改變
{
rb.velocity = _dir;
rb.gravityScale = _gravityScale;
}

Sword_Skill腳本:

? ? public void CreateSword()
{
GameObject newSword = Instantiate(swordPrefab,player.transform.position,transform.rotation);在玩家位置創建劍對象

? ? ? ? Sword_Skill_Control newSkillScript =newSword.GetComponent<Sword_Skill_Control>();

? ? ? ? newSkillScript.SetupSword(lanchForce, swordGravity);
}

PlayerAniamtionTrigger腳本:

? ? private void ThrowSword()
{
SkillManage.instance.sword.CreateSword();
}//在玩家投擲動畫中選擇一幀添加事件來調用該函數

3.實現瞄準時方向點的生成

我們想要在玩家瞄準時隨著鼠標移動展示不同的飛行軌跡并最終讓劍沿著這條軌跡發射,這需要我們創建一個點的預制體,然后再游戲時生成很多個點,并套用公式讓這些點排列成軌跡。

實現最終方向跟隨鼠標:

Sword_Skill腳本:

private Vector2 finalDir;

? ? private Vector2 AnimDirection()
{
Vector2 playerPostion=player.transform.position;
Vector2 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Vector2 direction = mousePosition - playerPostion;//由玩家指向鼠標

? ? ? ? return direction;
}

? ? protected override void ?Update()
{
if(Input.GetKeyUp(KeyCode.Mouse1))
{
finalDir = new Vector2(AnimDirection().normalized.x *lanchForce.x,AnimDirection().y *lanchForce.y);//normalized是歸一化處理,你可以理解把向量壓縮為1,乘以我們的初始方向即最終方向
}
}

? ? public void CreateSword()
{
GameObject newSword = Instantiate(swordPrefab,player.transform.position,transform.rotation);

? ? ? ? Sword_Skill_Control newSkillScript =newSword.GetComponent<Sword_Skill_Control>();

? ? ? ? newSkillScript.SetupSword(finalDir, swordGravity);//調用最終方向
}

實現瞄準點的排序:

? ? [Header("AnimDots info")]
[SerializeField] private int numbersofDots;//生成點的數量
[SerializeField] private float spaceBetweenTwoDots;//每個點間隔的時間
[SerializeField] private GameObject dotPrefab;//點的預制體,自行創建,記得更改圖層為地面
[SerializeField] private Transform dotsParent;//自行在玩家下創建一個子對象,作為生成所有點的父對象

? ? private GameObject[] dots;//生成點的數組

? ? private void GenerateDots()//生成所有點
{
dots = new GameObject[numbersofDots];
for (int i = 0; i < numbersofDots; i++)
{
dots[i]=Instantiate(dotPrefab,player.transform.position,Quaternion.identity,dotsParent);
dots[i].SetActive(false);
}
}

? ? protected override void Start()//調用上述函數
{
base.Start();

? ? ? ? GenerateDots();
}

? ? public void DotsActove(bool _isActive)//設置點是否可見
{
for(int i = 0; i < dots.Length; i++)//循環
{
dots[i].SetActive(_isActive);
}
}

? ? private Vector2 DotsPosition(float t)//返回每個點的位置
{
Vector2 position = (Vector2)player.transform.position + new Vector2(AnimDirection().normalized.x * lanchForce.x, AnimDirection().y * lanchForce.y) * t
+ .5f * (Physics2D.gravity * swordGravity) * (t * t);

//位置 = 初始位置 + 初速度 × 時間 + 0.5 × 加速度 × 時間2

? ? ? ? return position;
}

? ? protected override void ?Update()
{
if(Input.GetKeyUp(KeyCode.Mouse1))
{
finalDir = new Vector2(AnimDirection().normalized.x *lanchForce.x,AnimDirection().y *lanchForce.y);
}

? ? ? ? if(Input.GetKey(KeyCode.Mouse1))//按住鼠標右鍵時時刻更新這些點的位置
{
for(int i = 0; i < dots.Length; i++)
{
dots[i].transform.position = DotsPosition(i * spaceBetweenTwoDots);
}
}
}

PlayerAimSwordState腳本:

? ? public override void Enter()
{
base.Enter();

? ? ? ? SkillManage.instance.sword.DotsActove(true);
}

? ? public override void Exit()
{
base.Exit();

? ? ? ? SkillManage.instance.sword.DotsActove(false);
}//進入瞄準時可見這些點,退出消失

演示:

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

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

相關文章

【c++】問答系統代碼改進解析:新增日志系統提升可維護性——關于我用AI編寫了一個聊天機器人……(14)

在軟件開發中&#xff0c;代碼的迭代優化往往從提升可維護性、可追蹤性入手。本文將詳細解析新增的日志系統改進&#xff0c;以及這些改進如何提升系統的實用性和可調試性。一、代碼整體背景代碼實現了一個基于 TF-IDF 算法的問答系統&#xff0c;核心功能包括&#xff1a;加載…

visual studio2022編譯unreal engine5.4.4源碼

UE5系列文章目錄 文章目錄 UE5系列文章目錄 前言 一、ue5官網 二.編譯源碼中遇到的問題 前言 一、ue5官網 UE5官網 UE5源碼下載地址 這樣雖然下載比較快,但是不能進行代碼git管理,以后如何虛幻官方有大的版本變動需要重新下載源碼,所以我們還是最好需要visual studio2022…

vulhub Earth靶場攻略

靶場下載 下載鏈接&#xff1a;https://download.vulnhub.com/theplanets/Earth.ova 靶場使用 將壓縮包解壓到一個文件夾中&#xff0c;右鍵&#xff0c;用虛擬機打開&#xff0c;就創建成功了&#xff0c;然后啟動虛擬機&#xff1a; 這時候靶場已經啟動了&#xff0c;咱們現…

Python訓練Day24

浙大疏錦行 元組可迭代對象os模塊

Spring核心:Bean生命周期、外部化配置與組件掃描深度解析

Bean生命周期 說明 程序中的每個對象都有生命周期&#xff0c;對象的創建、初始化、應用、銷毀的整個過程稱之為對象的生命周期&#xff1b; 在對象創建以后需要初始化&#xff0c;應用完成以后需要銷毀時執行的一些方法&#xff0c;可以稱之為是生命周期方法&#xff1b; 在sp…

日語學習-日語知識點小記-進階-JLPT-真題訓練-N1階段(1):2017年12月-JLPT-N1

日語學習-日語知識點小記-進階-JLPT-真題訓練-N1階段&#xff08;1&#xff09;&#xff1a;2017年12月-JLPT-N1 1、前言&#xff08;1&#xff09;情況說明&#xff08;2&#xff09;工程師的信仰&#xff08;3&#xff09;真題訓練2、真題-2017年12月-JLPT-N1&#xff08;1&a…

(一)使用 LangChain 從零開始構建 RAG 系統|RAG From Scratch

RAG 的主要動機 大模型訓練的時候雖然使用了龐大的世界數據&#xff0c;但是并沒有涵蓋用戶關心的所有數據&#xff0c; 其預訓練令牌&#xff08;token&#xff09;數量雖大但相對這些數據仍有限。另外大模型輸入的上下文窗口越來越大&#xff0c;從幾千個token到幾萬個token,…

OpenCV學習探秘之一 :了解opencv技術及架構解析、數據結構與內存管理?等基礎

?一、OpenCV概述與技術演進? 1.1技術歷史? OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是由Intel于1999年發起創建的開源計算機視覺庫&#xff0c;后來交由OpenCV開源社區維護&#xff0c;旨在為計算機視覺應用提供通用基礎設施。經歷20余年發展&…

什么是JUC

摘要 Java并發工具包JUC是JDK5.0引入的重要并發編程工具&#xff0c;提供了更高級、靈活的并發控制機制。JUC包含鎖與同步器&#xff08;如ReentrantLock、Semaphore等&#xff09;、線程安全隊列&#xff08;BlockingQueue&#xff09;、原子變量&#xff08;AtomicInteger等…

零基礎學后端-PHP語言(第二期-PHP基礎語法)(通過php內置服務器運行php文件)

經過上期的配置&#xff0c;我們已經有了php的開發環境&#xff0c;編輯器我們繼續使用VScode&#xff0c;如果是新來的朋友可以看這期文章來配置VScode 零基礎學前端-傳統前端開發&#xff08;第一期-開發軟件介紹與本系列目標&#xff09;&#xff08;VScode安裝教程&#x…

擴散模型逆向過程詳解:如何從噪聲中恢復數據?

在擴散模型中&#xff0c;逆向過程的目標是從噪聲數據逐步恢復出原始數據。本文將詳細解析逆向條件分布 q(zt?1∣zt,x)q(\mathbf{z}_{t-1} \mid \mathbf{z}_t, \mathbf{x})q(zt?1?∣zt?,x)的推導過程&#xff0c;揭示擴散模型如何通過高斯分布實現數據重建。1. 核心問題 在…

2025年7月份實時最新獲取地圖邊界數據方法,省市區縣街道多級聯動【文末附實時geoJson數據下載】

動態生成最新行政區劃 GeoJSON 數據并結合 ECharts 實現地圖下鉆功能 在開發基于地圖的數據可視化應用時&#xff0c;一個常見的挑戰是獲取準確且最新的行政區劃邊界數據&#xff08;GeoJSON&#xff09;。許多現有的在線資源可能數據陳舊&#xff0c;無法反映最新的行政區劃調…

Spark實現WorldCount執行流程圖

spark可以分區并行執行&#xff0c;同時并行執行也可以基于內存完成迭代代碼對于大部分spark程序來說都是以driver開始driver結束&#xff0c;中間都是executor分布式運行

編程與數學 03-002 計算機網絡 02_網絡體系結構與協議

編程與數學 03-002 計算機網絡 02_網絡體系結構與協議一、網絡體系結構的基本概念&#xff08;一&#xff09;分層體系結構的優點&#xff08;二&#xff09;協議、接口與服務的概念二、OSI參考模型&#xff08;一&#xff09;七層模型的層次劃分及功能&#xff08;二&#xff…

Flutter 提取圖像主色調 ColorScheme.fromImageProvider

從圖像中提取主色調&#xff0c;用于動態適配顏色主題或者界面顏色。之前在 Flutter 應用里一直用的 palette_generator 插件&#xff0c;可以分析圖像顏色&#xff0c;從中提取一系列主要的色調。最近發現這個谷歌官方的插件竟然不維護了&#xff0c;后續沒有更新計劃了。 查找…

51c自動駕駛~合集8

自己的原文哦~ https://blog.51cto.com/whaosoft/11618683 #Hierarchical BEV BEV進入定制化時代&#xff01;清華Hierarchical BEV&#xff1a;創新多模塊學習框架&#xff0c;無痛落地無縫量產&#xff01;? 論文思路 自動駕駛指通過傳感器計算設備、信息通信、自…

Excel——重復值處理

識別重復行的三種方法方法1&#xff1a;COUNTIF公式法在E2單元格輸入公式&#xff1a;COUNTIF($B$2:$B2,B2)>1下拉填充至所有數據行結果為TRUE的即為重復行&#xff08;會標出第二次及以后出現的重復項&#xff09;方法2&#xff1a;排序IF公式法按商機號排序&#xff08;數…

華普微Matter模塊HM-MT7201,打破智能家居生態孤島

隨著智能家居滲透率與認可度的持續提升&#xff0c;消費者對于智能家居的功能訴求正從具備聯網控制、遠程控制與語音遙控等基礎交互能力&#xff0c;升級為能通過單一的家居生態平臺APP無縫控制所有的品牌設備&#xff0c;從而實現真正意義上的統一調度。這種從“單一設備聯網控…

如何使用 minio 完成OceanBase社區版的歸檔和備份

自OceanBase社區版4.2.1BP7版本起&#xff0c;OceanBase的歸檔與備份功能開始兼容AWS S3及S3協議的對象存儲服務&#xff0c;因此&#xff0c;許多用戶選擇采用 MinIO 作為其備份存儲介質。因為 MinIO 兼容AWS S3云存儲服務接口&#xff0c;成為了一個輕便的服務選項。 本文將…

Nacos-服務注冊,服務發現(二)

Nacos健康檢查 兩種健康檢查機制 Nacos作為注冊中?, 需要感知服務的健康狀態, 才能為服務調??提供良好的服務。 Nacos 中提供了兩種健康檢查機制&#xff1a; 客?端主動上報機制&#xff1a; 客?端通過?跳上報?式告知服務端(nacos注冊中?)健康狀態, 默認?跳間隔5…