Unity2D游戲開發-玩家控制

在Unity2D游戲開發中,玩家控制是游戲互動性的核心。本文將解析一個典型的Unity2D玩家控制腳本,探討如何實現流暢的玩家移動、跳躍和動畫切換。以下是一個Unity腳本示例,實現了這些基礎功能。

1. 腳本結構

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Playe : MonoBehaviour
{public float moveSpeed = 5.0f; // 角色移動的速度public float jumpForce = 5.0f; // 角色跳躍的力public float doulbjumpForce = 5.0f;//二段跳的力public Animator animator; //動畫組件public BoxCollider2D myFeet; //碰撞體積組件public Rigidbody2D rb; // 剛體組件private bool isGrounded; // 角色是否在地面上private bool canDoubleJump;void Start(){// 獲取剛體組件//rb = GetComponent<Rigidbody2D>();//myFeet = GetComponent<BoxCollider2D>();}void CheckGround() {//定義獲取到的地面isGrounded = myFeet.IsTouchingLayers(LayerMask.GetMask("Ground"));}//用于設置角色的水平翻轉,轉向方向void Flip(){bool Has = Mathf.Abs(rb.velocity.x) > Mathf.Epsilon;if (Has){if (rb.velocity.x > 0.1f){this.gameObject.transform.localRotation = Quaternion.Euler(0, 0, 0);}if (rb.velocity.x < -0.1f){this.gameObject.transform.localRotation = Quaternion.Euler(0, 180, 0);}}}void Update(){Run();Flip();Jump();ainmatorTiao();CheckGround();}void Jump() {// 如果玩家按下空格鍵并且在地面上,則跳躍if (Input.GetButtonDown("Jump")){if (isGrounded) {//打開名為TiaoYue的動畫Bool開關,把狀態設置為trueVector2 JumpV = new Vector2(0, jumpForce);rb.velocity = Vector2.up * JumpV;canDoubleJump = true;}elseif (canDoubleJump){Vector2 doubleJump = new Vector2(0.0f, doulbjumpForce);rb.velocity = Vector2.up * doulbjumpForce;canDoubleJump = false; }}}//動畫切換void ainmatorTiao(){// 更新動畫狀態animator.SetBool("DaiJi", !Input.GetButtonDown("Jump")); // 設置待機狀態,當沒有按下跳躍鍵時為trueanimator.SetBool("TiaoYue2", false); // 默認情況下,二連跳動畫為false// 如果角色在地面上,并且沒有按下跳躍鍵,則設置待機動畫if (isGrounded && !Input.GetButtonDown("Jump")){animator.SetBool("TiaoYue", false); // 當角色在地面上且沒有按下跳躍鍵時,關閉跳躍動畫}// 如果角色按下跳躍鍵并且在地面上,則觸發第一跳動畫else if (Input.GetButtonDown("Jump") && isGrounded){animator.SetBool("DaiJi", false);animator.SetBool("TiaoYue", true); // 觸發第一跳動畫}// 如果角色在空中并且按下跳躍鍵,則觸發第二跳動畫else if (Input.GetButtonDown("Jump") && !isGrounded && !animator.GetBool("TiaoYue2")){animator.SetBool("DaiJi", false);animator.SetBool("TiaoYue", true); // 觸發第二跳動畫}}void Run() {// 獲取水平(AD鍵)的輸入float moverDir = Input.GetAxis("Horizontal");Vector2 playerVel = new Vector2(moverDir * moveSpeed, rb.velocity.y);rb.velocity = playerVel;bool Has = Mathf.Abs(rb.velocity.x) > Mathf.Epsilon;animator.SetBool("YiDong", Has);}}

?

2. 移動(Run)功能

Run方法中,我們根據玩家的輸入獲取水平方向上的移動速度,并應用這個速度到玩家的Rigidbody2D組件上。同時,我們檢查玩家是否在移動,以決定是否播放移動動畫。

void Run() 
{// 獲取水平方向上的輸入float moverDir = Input.GetAxis("Horizontal");// 設置玩家的速度Vector2 playerVel = new Vector2(moverDir * moveSpeed, rb.velocity.y);rb.velocity = playerVel;// 檢查玩家是否在移動,并設置動畫參數bool Has = Mathf.Abs(rb.velocity.x) > Mathf.Epsilon;animator.SetBool("YiDong", Has);
}

3. 翻轉(Flip)功能

Flip方法用于根據玩家的移動方向來翻轉玩家的方向。如果玩家向左移動,則角色朝左;如果向右移動,則角色朝右。

void Flip()
{// 檢查玩家是否有水平速度bool Has = Mathf.Abs(rb.velocity.x) > Mathf.Epsilon;if (Has){// 根據速度方向翻轉角色if (rb.velocity.x > 0.1f){this.gameObject.transform.localRotation = Quaternion.Euler(0, 0, 0);}if (rb.velocity.x < -0.1f){this.gameObject.transform.localRotation = Quaternion.Euler(0, 180, 0);}}
}

4. 跳躍(Jump)功能

Jump方法中,我們檢查玩家是否按下跳躍鍵,并根據玩家是否在地面上或是否可以進行雙重跳躍來應用跳躍力。

void Jump() 
{// 如果玩家按下跳躍鍵if (Input.GetButtonDown("Jump")){// 如果玩家在地面上,則進行普通跳躍if (isGrounded){Vector2 JumpV = new Vector2(0, jumpForce);rb.velocity = Vector2.up * JumpV;canDoubleJump = true;}// 如果玩家不在地面上但可以進行雙重跳躍,則進行雙重跳躍else if (canDoubleJump){Vector2 doubleJump = new Vector2(0.0f, doulbjumpForce);rb.velocity = Vector2.up * doulbjumpForce;canDoubleJump = false;}}
}

5. 動畫切換(ainmatorTiao)功能

ainmatorTiao方法用于根據玩家的狀態來切換玩家的動畫。例如,當玩家跳躍時,會播放跳躍動畫;當玩家在地面上時,會播放跑步或靜止動畫。

    void ainmatorTiao()
{// 設置動畫參數以控制動畫的播放animator.SetBool("DaiJi", !Input.GetButtonDown("Jump")); // 設置待機動畫animator.SetBool("TiaoYue2", false); // 設置跳躍動畫為false// 如果玩家在地面上且沒有按下跳躍鍵,則設置跳躍動畫為falseif (isGrounded && !Input.GetButtonDown("Jump")){animator.SetBool("TiaoYue", false);}// 如果玩家按下跳躍鍵且在地面上,則設置跳躍動畫為trueelse if (Input.GetButtonDown("Jump") && isGrounded){animator.SetBool("DaiJi", false);animator.SetBool("TiaoYue", true);}// 如果玩家按下跳躍鍵且不在地面上且沒有播放第二次跳躍動畫,則設置跳躍動畫為trueelse if (Input.GetButtonDown("Jump") && !isGrounded && !animator.GetBool("TiaoYue2")){animator.SetBool("DaiJi", false);animator.SetBool("TiaoYue", true);}
}

6. 地面檢測(CheckGround)功能

CheckGround方法用于檢測玩家是否在地面上。這通過檢查玩家的腳部碰撞體是否接觸地面層來實現。

void CheckGround() 
{// 檢查玩家是否在地面上isGrounded = myFeet.IsTouchingLayers(LayerMask.GetMask("Ground"));
}

結論

通過上述腳本,我們了解了Unity2D游戲開發中實現玩家控制的基本方法。這個腳本展示了如何使用Unity的輸入系統、Rigidbody2D組件和Animator組件來實現平滑的玩家移動、跳躍和動畫切換。開發者可以根據自己的游戲需求對腳本進行修改和擴展,以實現更復雜的玩家控制邏輯。

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

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

相關文章

機械設計手冊第一冊:公差

形位公差的標注&#xff1a; 形位公差框格中&#xff0c;不僅要表達形位公差的特征項目、基準代號和其他符號&#xff0c;還要正確給出公差帶的大小、形狀等內容。 1.形位公差框格&#xff1a; 形位公差框格由兩個框格或多個格框組成&#xff0c;框格中的主要內容從左到右按…

(2024,擴散,去噪調度,維度,誤差,收斂速度)適應基于分數的擴散模型中的未知低維結構

Adapting to Unknown Low-Dimensional Structures in Score-Based Diffusion Models 公和眾和號&#xff1a;EDPJ&#xff08;進 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 進 V 交流群&#xff09; 目錄 0. 摘要 1. 引言 1.1 擴散模型 1.2 現有結果的不…

服務器硬件基礎知識學習

服務器硬件基礎知識涵蓋了從CPU到存儲&#xff0c;再到網絡連接和總線技術等關鍵組件。 1. 處理器 - 兩大流派&#xff1a;我們常用的處理器主要分為Intel和AMD兩大陣營。Intel的Xeon系列和AMD的EPYC系列都是專為服務器設計的&#xff0c;它們支持多核處理&#xff0c;能夠應對…

語言模型的校準技術:增強概率評估

? 使用 DALLE-3 模型生成的圖像 目錄 一、說明 二、為什么校準對 LLM 模型至關重要 三、校準 LLM 概率的挑戰 四、LLM 的高級校準方法 4.1 語言置信度 4.2 增強語言自信的先進技術 4.3 基于自一致性的置信度 4.4 基于 Logit 的方法 五、代理模型或微調方法 5.1 使用代…

集成算法實驗與分析(軟投票與硬投票)

概述 目的&#xff1a;讓機器學習效果更好&#xff0c;單個不行&#xff0c;集成多個 集成算法 Bagging&#xff1a;訓練多個分類器取平均 f ( x ) 1 / M ∑ m 1 M f m ( x ) f(x)1/M\sum^M_{m1}{f_m(x)} f(x)1/M∑m1M?fm?(x) Boosting&#xff1a;從弱學習器開始加強&am…

排序-插入排序與選擇排序

插入排序 基本思想 把待排序的記錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中&#xff0c;直到所有的記錄插入完為止&#xff0c;得到一個新的有序序列 。 打撲克牌整理手牌用的就是插入排序的思想 代碼實現 void InsertSort(int* a, int n) { assert(a); …

C語言自定義類型

在C語言中&#xff0c;自定義類型可以通過typedef關鍵字來實現。typedef用于為現有的數據類型創建新的名稱&#xff08;別名&#xff09;&#xff0c;使代碼更清晰易讀。自定義類型的一個常見用途是簡化復雜的類型聲明&#xff0c;特別是在使用結構體、枚舉和函數指針時。 使用…

52、有邊數限制的最短路

有邊數限制的最短路 題目描述 給定一個n個點m條邊的有向圖&#xff0c;圖中可能存在重邊和自環&#xff0c; 邊權可能為負數。 請你求出從1號點到n號點的最多經過k條邊的最短距離&#xff0c;如果無法從1號點走到n號點&#xff0c;輸出impossible。 注意&#xff1a;圖中可…

查看 WSL2 (Windows Subsystem for Linux 2) IP 地址

查看 WSL2 [Windows Subsystem for Linux 2] IP 地址 1. ipconfig2. ping $(hostname).local3. cat /etc/resolv.conf4. ip route show5. ip addrReferences 1. ipconfig Windows 系統上與 WSL2 (Windows Subsystem for Linux 2) 接口的地址 172.31.32.1。 Microsoft Windows…

米爾MYC-Y6ULX-V2開發板測評記錄

文章目錄 1、板子上手體驗2、板載硬件3、系統信息4、 驅動測試5、編譯linux三大件7、攝像頭測試9、總結 1、板子上手體驗 首先非常感謝芯查查給了這樣一個機會來測評這樣一款性能十分強大的開發板&#xff0c;我拿到手的是MYC-Y6ULX-V2核心板及開發板&#xff0c;這塊板子具有…

STM32HAL-最簡單的長、短、多擊按鍵框架

目錄 概述 一、開發環境 二、STM32CubeMx配置 三、編碼 四、運行結果 五、總結 概述 本文章使用最簡單的寫法實現長、短、多擊按鍵框架&#xff0c;非常適合移植各類型單片機&#xff0c;特別是資源少的芯片上。接下來將在stm32單片機上實現&#xff0c;只需占用1個定時…

動態控制eBPF程序加載:檢查 Tracepoint、Kprobe是否存在

前言 在 eBPF 程序開發中&#xff0c;確保程序能夠在各種不同的系統配置中兼容運行是至關重要的。本文將詳細介紹一個方案&#xff0c;通過動態檢查Tracepoint、Kprobe是否存在&#xff0c;并結合libbpf的API接口控制 eBPF 程序的加載。這種方法不僅可以提升程序的靈活性&…

jwt 實現用戶登錄完整java

登錄校驗邏輯 用戶登錄的校驗邏輯分為三個主要步驟&#xff0c;分別是校驗驗證碼&#xff0c;校驗用戶狀態和校驗密碼&#xff0c;具體邏輯如下 前端發送username、password、captchaKey、captchaCode請求登錄。判斷captchaCode是否為空&#xff0c;若為空&#xff0c;則直接…

AWS聯網和內容分發服務

概況 VPC Amazon Virtual Private Cloud (Amazon VPC) 讓您能夠全面地控制自己的虛擬網絡環境&#xff0c;包括資源放置、連接性和安全性。首先在 AWS 服務控制臺中設置 VPC。然后&#xff0c;向其中添加資源&#xff0c;例如 Amazon Elastic Compute Cloud (EC2) 和 Amazon …

數據分析必備:一步步教你如何用Pandas做數據分析(15)

1、Pandas 數據丟失 Pandas 數據丟失的操作實例 在現實生活中&#xff0c;數據丟失始終是一個問題。機器學習和數據挖掘等領域在模型預測的準確性方面面臨嚴重問題&#xff0c;因為缺少值會導致數據質量較差。在這些領域中&#xff0c;缺失值處理是使模型更準確和有效的主要重…

定個小目標之每天刷LeetCode熱題(7)

今天這道題是道簡單題&#xff0c;使用雙指針進行迭代即可&#xff0c;畫了下草圖如下 代碼如下 class Solution {public ListNode reverseList(ListNode head) {if (head null || head.next null) {return head;}ListNode p head, q head.next, temp null;while (q ! nu…

【Python如何將EXCEL拆分】

文章目錄 Python將一個EXCEL表拆分多個excel表Python將一個EXCEL表中一個sheet拆分多個sheet表 Python將一個EXCEL表拆分多個excel表 在Python中&#xff0c;你可以使用pandas庫來讀取Excel文件&#xff0c;并將一個大的Excel表格&#xff08;工作表&#xff09;拆分成多個單獨…

Writerside生成在線幫助文檔或用戶手冊軟件基礎使用教程

Writerside是JetBrains出的一個技術文檔工具&#xff0c;既能用在JetBrains IDE上&#xff0c;也能單獨用。它能幫你輕松寫、建、測、發技術文檔&#xff0c;像產品說明、API參考、開發指南等都能搞定。 特點&#xff1a; 文檔即代碼&#xff1a;它讓你像管代碼一樣管文檔&…

【大數據Spark】常見面試題(萬字!建議收藏)

文章目錄 入門級中等難度中高級難度數據傾斜解決方法 入門級 什么是Apache Spark&#xff1f;它與傳統的MapReduce有何不同&#xff1f; Apache Spark是一個開源的分布式計算系統&#xff0c;它提供了高效的數據處理和分析能力。與傳統的MapReduce相比&#xff0c;Spark具有更快…

海光CPU:國產信創的“芯“動力解讀

國產信創CPU-海光CPU CPU&#xff1a;信創根基&#xff0c;國之重器 國產CPU形成三大陣營&#xff1a;自主架構、x86及ARM。自主陣營中&#xff0c;龍芯和申威以LoongArch和SW-64為基石&#xff1b;ARM陣營由鯤鵬、飛騰主導&#xff0c;依托ARM授權研發處理器&#xff1b;x86陣…