中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

在美國注冊一個(gè)網(wǎng)站 大陸做銷售網(wǎng)址推薦

在美國注冊一個(gè)網(wǎng)站 大陸做銷售,網(wǎng)址推薦,湖州網(wǎng)站集約化平臺(tái),怎么做二級(jí)網(wǎng)站最終效果 文章目錄 最終效果前言素材下載:玩家移動(dòng)跳躍控制攻擊動(dòng)畫配置輕攻擊重攻擊 攻擊時(shí)禁止移動(dòng)和攻擊移動(dòng)補(bǔ)償敵人擊退和播放受擊動(dòng)畫受擊特效攻擊停頓和屏幕震動(dòng)局部頓幀(補(bǔ)充)參考源碼完結(jié) 前言 注意本文為自己的學(xué)習(xí)記錄筆記&#…

最終效果

在這里插入圖片描述

文章目錄

  • 最終效果
  • 前言
  • 素材下載:
  • 玩家移動(dòng)跳躍控制
  • 攻擊動(dòng)畫配置
    • 輕攻擊
    • 重攻擊
  • 攻擊時(shí)禁止移動(dòng)和攻擊移動(dòng)補(bǔ)償
  • 敵人擊退和播放受擊動(dòng)畫
  • 受擊特效
  • 攻擊停頓和屏幕震動(dòng)
  • 局部頓幀(補(bǔ)充)
  • 參考
  • 源碼
  • 完結(jié)

前言

注意本文為自己的學(xué)習(xí)記錄筆記,主要是對(duì)游戲攻擊 連擊 輕重攻擊和打擊感進(jìn)行探究,其中打擊感實(shí)現(xiàn)一般依靠播放受擊動(dòng)畫、擊退、攻擊特效、時(shí)停和屏幕震動(dòng)反饋等來實(shí)現(xiàn),如果你有其他的好方法也歡迎補(bǔ)充。

素材下載:

人物
https://legnops.itch.io/red-hood-character
在這里插入圖片描述

敵人
https://jesse-m.itch.io/skeleton-pack
在這里插入圖片描述

環(huán)境
https://szadiart.itch.io/pixel-fantasy-caves
在這里插入圖片描述

攻擊特效
https://v-ktor.itch.io/pixelated-attackhit-animations
在這里插入圖片描述

玩家移動(dòng)跳躍控制

public class PlayerController : MonoBehaviour
{[Header("移動(dòng)和跳躍參數(shù)")] public float moveSpeed; // 移動(dòng)速度public float jumpForce; // 跳躍力量new private Rigidbody2D rigidbody; // 剛體組件private Animator animator; // 動(dòng)畫控制器private float input; // 輸入private bool isGround; // 是否在地面上[SerializeField] private LayerMask layer; // 地面碰撞層[SerializeField] private Vector3 check; // 地面檢測向量void Start(){rigidbody = GetComponent<Rigidbody2D>();animator = GetComponent<Animator>();}void Update(){input = Input.GetAxisRaw("Horizontal");isGround = Physics2D.OverlapCircle(transform.position + new Vector3(check.x, check.y, 0), check.z, layer);animator.SetFloat("Horizontal", rigidbody.velocity.x);animator.SetFloat("Vertical", rigidbody.velocity.y);animator.SetBool("isGround", isGround);Move();Attack();}void Move(){// 根據(jù)輸入來移動(dòng)角色rigidbody.velocity = new Vector2(input * moveSpeed, rigidbody.velocity.y);// 處理跳躍if (Input.GetButtonDown("Jump") && isGround){rigidbody.velocity = new Vector2(0, jumpForce);animator.SetTrigger("Jump"); // 觸發(fā)跳躍動(dòng)畫}// 根據(jù)水平速度方向更新角色朝向if (rigidbody.velocity.x < 0)transform.localScale = new Vector3(-1, 1, 1); // 向左else if (rigidbody.velocity.x > 0)transform.localScale = new Vector3(1, 1, 1); // 向右}private void OnDrawGizmos(){Gizmos.DrawWireSphere(transform.position + new Vector3(check.x, check.y, 0), check.z);}}

攻擊動(dòng)畫配置

攻擊動(dòng)畫分為輕攻擊和重攻擊

輕攻擊

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

重攻擊

在這里插入圖片描述

[Header("攻擊")]
public float interval = 2f; // 攻擊間隔時(shí)間
private float timer; // 計(jì)時(shí)器
private bool isAttack; // 是否正在攻擊
private string attackType; // 攻擊類型
private int comboStep; // 連擊步驟void Update()
{//...Attack();
}void Attack()
{// 輕攻擊輸入檢測if (Input.GetKeyDown(KeyCode.Return) && !isAttack){isAttack = true;attackType = "Light";comboStep++; // 連擊步驟加一if (comboStep > 3)comboStep = 1; // 連擊步驟循環(huán)timer = interval; // 設(shè)置計(jì)時(shí)器animator.SetTrigger("LightAttack"); // 觸發(fā)輕攻擊動(dòng)畫animator.SetInteger("ComboStep", comboStep); // 設(shè)置連擊步驟參數(shù)}// 重攻擊輸入檢測if (Input.GetKeyDown(KeyCode.RightShift) && !isAttack){isAttack = true;attackType = "Heavy";comboStep++; // 連擊步驟加一if (comboStep > 3)comboStep = 1; // 連擊步驟循環(huán)timer = interval; // 設(shè)置計(jì)時(shí)器animator.SetTrigger("HeavyAttack"); // 觸發(fā)重攻擊動(dòng)畫animator.SetInteger("ComboStep", comboStep); // 設(shè)置連擊步驟參數(shù)}// 處理連擊計(jì)時(shí)器if (timer != 0){timer -= Time.deltaTime;if (timer <= 0){timer = 0;comboStep = 0; // 重置連擊步驟}}
}//攻擊結(jié)束
public void AttackOver()
{isAttack = false;
}

配置每個(gè)攻擊動(dòng)畫,在執(zhí)行的位置執(zhí)行攻擊結(jié)束事件,通常攻擊結(jié)束事件都不會(huì)放在動(dòng)畫的最后一幀,因?yàn)檫B擊一般都存在預(yù)輸入,也就是在上一個(gè)動(dòng)畫還未結(jié)束時(shí)就進(jìn)行輸入,這樣能很好的提升combo的連貫性
在這里插入圖片描述
效果
在這里插入圖片描述

攻擊時(shí)禁止移動(dòng)和攻擊移動(dòng)補(bǔ)償

攻擊時(shí)我們不希望玩家還能移動(dòng),但是簡單粗暴的禁止移動(dòng)又會(huì)影響我們的攻擊操作手感,在死亡細(xì)胞等游戲中,攻擊時(shí)會(huì)朝前方以一個(gè)較小的速度移動(dòng),這樣可以一定程度的補(bǔ)償攻擊時(shí)無法移動(dòng)的缺陷
在這里插入圖片描述

[Header("攻擊補(bǔ)償速度")]
public float lightSpeed; // 輕攻擊速度
public float heavySpeed; // 重攻擊速度void Move()
{// 如果玩家沒有在攻擊狀態(tài)下,根據(jù)輸入來移動(dòng)角色if (!isAttack)rigidbody.velocity = new Vector2(input * moveSpeed, rigidbody.velocity.y);else{// 如果正在攻擊,則根據(jù)攻擊類型設(shè)置速度if (attackType == "Light")rigidbody.velocity = new Vector2(transform.localScale.x * lightSpeed, rigidbody.velocity.y);else if (attackType == "Heavy")rigidbody.velocity = new Vector2(transform.localScale.x * heavySpeed, rigidbody.velocity.y);}// ...
}

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

敵人擊退和播放受擊動(dòng)畫

配置敵人受擊動(dòng)畫
在這里插入圖片描述
配置玩家每個(gè)動(dòng)畫的攻擊范圍
在這里插入圖片描述
新增Enemy 敵人腳本,實(shí)現(xiàn)擊退和受擊動(dòng)畫

public class Enemy : MonoBehaviour
{public float speed;                 // 敵人的移動(dòng)速度private Vector2 direction;          // 受擊時(shí)的移動(dòng)方向private bool isHit;                 // 是否正在受擊狀態(tài)private AnimatorStateInfo info;     // 動(dòng)畫狀態(tài)信息private Animator animator;          // 敵人的主動(dòng)畫控制器new private Rigidbody2D rigidbody;  // 敵人的剛體組件void Start(){// 獲取組件的引用animator = transform.GetComponent<Animator>();rigidbody = transform.GetComponent<Rigidbody2D>();}void Update(){info = animator.GetCurrentAnimatorStateInfo(0); // 獲取當(dāng)前動(dòng)畫狀態(tài)信息if (isHit){rigidbody.velocity = direction * speed; // 根據(jù)受擊方向設(shè)置速度if (info.normalizedTime >= .6f)isHit = false; // 當(dāng)動(dòng)畫播放超過60%時(shí)結(jié)束受擊狀態(tài)}}// 外部調(diào)用,使敵人進(jìn)入受擊狀態(tài)public void GetHit(Vector2 direction){transform.localScale = new Vector3(-direction.x, 1, 1); // 根據(jù)受擊方向調(diào)整朝向isHit = true; // 進(jìn)入受擊狀態(tài)this.direction = direction; // 設(shè)置受擊方向animator.SetTrigger("Hit"); // 播放主動(dòng)畫的受擊動(dòng)畫狀態(tài)}
}

修改PlayerController,調(diào)用擊退敵人

private void OnTriggerEnter2D(Collider2D other)
{if (other.CompareTag("Enemy")){// 根據(jù)角色朝向確定敵人受擊方向if (transform.localScale.x > 0)other.GetComponent<Enemy>().GetHit(Vector2.right); // 右側(cè)受擊else if (transform.localScale.x < 0)other.GetComponent<Enemy>().GetHit(Vector2.left); // 左側(cè)受擊}
}

效果
在這里插入圖片描述

受擊特效

在這里插入圖片描述
特效動(dòng)畫配置
在這里插入圖片描述
修改Enemy

private Animator hitAnimator;       // 敵人的受擊特效動(dòng)畫控制器hitAnimator = transform.GetChild(0).GetComponent<Animator>(); // 敵人的受擊特效動(dòng)畫控制器在子對(duì)象中// 外部調(diào)用,使敵人進(jìn)入受擊狀態(tài)public void GetHit(Vector2 direction){//...hitAnimator.SetTrigger("Hit"); // 播放受擊特效動(dòng)畫}

效果
在這里插入圖片描述

攻擊停頓和屏幕震動(dòng)

新增AttackSense

public class AttackSense : MonoBehaviour
{private static AttackSense instance;public static AttackSense Instance{get{if (instance == null)instance = FindObjectOfType<AttackSense>(); // 查找當(dāng)前場景中的 AttackSense 實(shí)例return instance;}}private bool isShake; // 是否正在進(jìn)行攝像機(jī)震動(dòng)// 暫停游戲一段時(shí)間public void HitPause(int duration){StartCoroutine(Pause(duration));}// 使用協(xié)程實(shí)現(xiàn)暫停功能IEnumerator Pause(int duration){float pauseTime = duration / 60f; // 將幀數(shù)轉(zhuǎn)換為實(shí)際暫停時(shí)間Time.timeScale = 0.2f; // 將游戲時(shí)間縮放設(shè)為0.2yield return new WaitForSecondsRealtime(pauseTime); // 等待指定的暫停時(shí)間Time.timeScale = 1; // 恢復(fù)游戲時(shí)間正常}// 觸發(fā)攝像機(jī)震動(dòng)效果public void CameraShake(float duration, float strength){if (!isShake) // 如果當(dāng)前沒有進(jìn)行震動(dòng)StartCoroutine(Shake(duration, strength));}// 使用協(xié)程實(shí)現(xiàn)攝像機(jī)震動(dòng)效果IEnumerator Shake(float duration, float strength){isShake = true; // 標(biāo)記正在進(jìn)行震動(dòng)Transform camera = Camera.main.transform; // 獲取主攝像機(jī)的 Transform 組件Vector3 startPosition = camera.position; // 記錄攝像機(jī)震動(dòng)前的初始位置while (duration > 0){// 將攝像機(jī)位置隨機(jī)偏移一定范圍來模擬震動(dòng)效果camera.position = Random.insideUnitSphere * strength + startPosition;duration -= Time.deltaTime; // 每幀減去時(shí)間yield return null; // 等待下一幀}camera.position = startPosition; // 震動(dòng)結(jié)束后將攝像機(jī)位置恢復(fù)到初始位置isShake = false; // 結(jié)束震動(dòng)狀態(tài)}
}

修改PlayerController調(diào)用

[Header("打擊感")]
public float shakeTime; // 搖晃時(shí)間
public int lightPause; // 輕攻擊暫停時(shí)間
public float lightStrength; // 輕攻擊相機(jī)震動(dòng)強(qiáng)度
public int heavyPause; // 重攻擊暫停時(shí)間
public float heavyStrength; // 重攻擊相機(jī)震動(dòng)強(qiáng)度private void OnTriggerEnter2D(Collider2D other)
{if (other.CompareTag("Enemy")){// 根據(jù)攻擊類型處理打擊感if (attackType == "Light"){AttackSense.Instance.HitPause(lightPause); // 輕攻擊暫停AttackSense.Instance.CameraShake(shakeTime, lightStrength); // 相機(jī)震動(dòng)}else if (attackType == "Heavy"){AttackSense.Instance.HitPause(heavyPause); // 重攻擊暫停AttackSense.Instance.CameraShake(shakeTime, heavyStrength); // 相機(jī)震動(dòng)}// 根據(jù)角色朝向確定敵人擊退方向if (transform.localScale.x > 0)other.GetComponent<Enemy>().GetHit(Vector2.right); // 右側(cè)受擊else if (transform.localScale.x < 0)other.GetComponent<Enemy>().GetHit(Vector2.left); // 左側(cè)受擊}
}

配置參數(shù)
在這里插入圖片描述
最終效果
在這里插入圖片描述

局部頓幀(補(bǔ)充)

前面的頓幀這個(gè)思路其實(shí)不太好,可以看看有的游戲,他們不是所有物體都停頓的,一般是攻擊者和受擊者停頓,其他的不受影響。animator有個(gè)scale播放速度scale值應(yīng)該可以實(shí)現(xiàn)這種效果,連續(xù)攻擊可能用局部頓幀好一點(diǎn),下面大概分享一下思路

public class AttackController : MonoBehaviour
{public Animator animator;public float slowMotionTimeScale = 0.5f; // 慢動(dòng)作時(shí)的時(shí)間縮放值public void PerformAttack(){StartCoroutine(AttackCoroutine());}IEnumerator AttackCoroutine(){// 播放攻擊動(dòng)畫前先設(shè)置慢動(dòng)作animator.speed = slowMotionTimeScale;// 等待攻擊動(dòng)畫播放完成yield return new WaitForSeconds(animator.GetCurrentAnimatorStateInfo(0).length / slowMotionTimeScale);// 恢復(fù)正常時(shí)間縮放animator.speed = 1f;}
}

在這個(gè)示例中,PerformAttack 方法可以被調(diào)用來開始攻擊動(dòng)作。在攻擊動(dòng)作開始時(shí),時(shí)間縮放被設(shè)置為 slowMotionTimeScale,然后通過 Coroutine 等待攻擊動(dòng)畫播放完成后,再恢復(fù)為正常速度。

通過這種方法,你可以在游戲中實(shí)現(xiàn)局部的動(dòng)畫停頓效果,而不是整體減速,從而增強(qiáng)游戲的視覺沖擊力和玩家的體驗(yàn)。

參考

https://www.bilibili.com/video/BV1fX4y1G7tv

源碼

整理好我會(huì)放上來

完結(jié)

贈(zèng)人玫瑰,手有余香!如果文章內(nèi)容對(duì)你有所幫助,請(qǐng)不要吝嗇你的點(diǎn)贊評(píng)論和關(guān)注,以便我第一時(shí)間收到反饋,你的每一次支持都是我不斷創(chuàng)作的最大動(dòng)力。當(dāng)然如果你發(fā)現(xiàn)了文章中存在錯(cuò)誤或者有更好的解決方法,也歡迎評(píng)論私信告訴我哦!

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

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

http://www.risenshineclean.com/news/58421.html

相關(guān)文章:

  • 自己做網(wǎng)站現(xiàn)實(shí)么網(wǎng)站設(shè)計(jì)就業(yè)
  • 沒網(wǎng)站能不能cpc廣告點(diǎn)擊賺錢做關(guān)鍵詞優(yōu)化排名的步驟
  • 開發(fā)網(wǎng)頁系統(tǒng)一般多少錢windows優(yōu)化大師官網(wǎng)
  • 中學(xué)生旅游網(wǎng)站開發(fā)的論文怎么寫外鏈seo推廣
  • 都昌網(wǎng)站建設(shè)seo可以從哪些方面優(yōu)化
  • 企業(yè)網(wǎng)站推廣設(shè)計(jì)網(wǎng)站優(yōu)化推廣
  • 個(gè)人網(wǎng)站怎么做支付寶接口google推廣妙招
  • wordpress主題生成seo這個(gè)行業(yè)怎么樣
  • 做爰網(wǎng)站美女東莞今日頭條最新消息
  • 網(wǎng)站建設(shè)怎么樣真正免費(fèi)建站
  • 網(wǎng)站做推廣需要多少錢seo博客優(yōu)化
  • 網(wǎng)站建設(shè)畢業(yè)設(shè)計(jì)中期檢查自己怎么創(chuàng)建一個(gè)網(wǎng)站
  • 重慶網(wǎng)站建設(shè)公司模板地推掃碼平臺(tái)
  • 找電商平臺(tái)幫我賣產(chǎn)品網(wǎng)站優(yōu)化排名工具
  • 鷹潭市城鄉(xiāng)建設(shè)局網(wǎng)站seo實(shí)戰(zhàn)密碼第四版
  • ASP動(dòng)態(tài)商業(yè)網(wǎng)站建設(shè)案例山西seo優(yōu)化公司
  • 用織夢做的網(wǎng)站一般后臺(tái)個(gè)人主頁網(wǎng)頁設(shè)計(jì)
  • 網(wǎng)站如何做友情鏈接edm營銷
  • 公司網(wǎng)站鏈接開封網(wǎng)站優(yōu)化公司
  • 筋鄭州做網(wǎng)站百度云搜索引擎入口網(wǎng)盤搜索神器
  • 代碼生成器app下載天津百度關(guān)鍵詞seo
  • 公司oa辦公平臺(tái)寧波seo優(yōu)化服務(wù)
  • 做產(chǎn)品表情的網(wǎng)站手機(jī)上怎么制作網(wǎng)頁
  • 上海美術(shù)設(shè)計(jì)公司廣州百度提升優(yōu)化
  • 智能手機(jī)網(wǎng)站模板四平網(wǎng)絡(luò)推廣
  • WordPress旋轉(zhuǎn)圖標(biāo)seo模板建站
  • 做ppt介紹網(wǎng)站嗎抖音關(guān)鍵詞排名軟件
  • 主流建站cms品牌seo培訓(xùn)咨詢
  • 大唐工作室 網(wǎng)站制作天貓seo搜索優(yōu)化
  • 做游戲網(wǎng)站教程百度seo是啥意思