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

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

在美國(guó)注冊(cè)一個(gè)網(wǎng)站 大陸做銷售品牌推廣活動(dòng)策劃案例

在美國(guó)注冊(cè)一個(gè)網(wǎng)站 大陸做銷售,品牌推廣活動(dòng)策劃案例,深圳營(yíng)銷外貿(mào)網(wǎng)站制作,小程序開(kāi)發(fā)平臺(tái)打不了字最終效果 文章目錄 最終效果前言素材下載:玩家移動(dòng)跳躍控制攻擊動(dòng)畫(huà)配置輕攻擊重攻擊 攻擊時(shí)禁止移動(dòng)和攻擊移動(dòng)補(bǔ)償敵人擊退和播放受擊動(dòng)畫(huà)受擊特效攻擊停頓和屏幕震動(dòng)局部頓幀(補(bǔ)充)參考源碼完結(jié) 前言 注意本文為自己的學(xué)習(xí)記錄筆記&#…

最終效果

在這里插入圖片描述

文章目錄

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

前言

注意本文為自己的學(xué)習(xí)記錄筆記,主要是對(duì)游戲攻擊 連擊 輕重攻擊和打擊感進(jìn)行探究,其中打擊感實(shí)現(xiàn)一般依靠播放受擊動(dòng)畫(huà)、擊退、攻擊特效、時(shí)停和屏幕震動(dòng)反饋等來(lái)實(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)畫(huà)控制器private float input; // 輸入private bool isGround; // 是否在地面上[SerializeField] private LayerMask layer; // 地面碰撞層[SerializeField] private Vector3 check; // 地面檢測(cè)向量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ù)輸入來(lái)移動(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)畫(huà)}// 根據(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)畫(huà)配置

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

輕攻擊

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

重攻擊

在這里插入圖片描述

[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()
{// 輕攻擊輸入檢測(cè)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)畫(huà)animator.SetInteger("ComboStep", comboStep); // 設(shè)置連擊步驟參數(shù)}// 重攻擊輸入檢測(cè)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)畫(huà)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)畫(huà),在執(zhí)行的位置執(zhí)行攻擊結(jié)束事件,通常攻擊結(jié)束事件都不會(huì)放在動(dòng)畫(huà)的最后一幀,因?yàn)檫B擊一般都存在預(yù)輸入,也就是在上一個(gè)動(dòng)畫(huà)還未結(jié)束時(shí)就進(jìn)行輸入,這樣能很好的提升combo的連貫性
在這里插入圖片描述
效果
在這里插入圖片描述

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

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

[Header("攻擊補(bǔ)償速度")]
public float lightSpeed; // 輕攻擊速度
public float heavySpeed; // 重攻擊速度void Move()
{// 如果玩家沒(méi)有在攻擊狀態(tài)下,根據(jù)輸入來(lái)移動(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)畫(huà)

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

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)畫(huà)狀態(tài)信息private Animator animator;          // 敵人的主動(dòng)畫(huà)控制器new private Rigidbody2D rigidbody;  // 敵人的剛體組件void Start(){// 獲取組件的引用animator = transform.GetComponent<Animator>();rigidbody = transform.GetComponent<Rigidbody2D>();}void Update(){info = animator.GetCurrentAnimatorStateInfo(0); // 獲取當(dāng)前動(dòng)畫(huà)狀態(tài)信息if (isHit){rigidbody.velocity = direction * speed; // 根據(jù)受擊方向設(shè)置速度if (info.normalizedTime >= .6f)isHit = false; // 當(dāng)動(dòng)畫(huà)播放超過(guò)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)畫(huà)的受擊動(dòng)畫(huà)狀態(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)畫(huà)配置
在這里插入圖片描述
修改Enemy

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

效果
在這里插入圖片描述

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

新增AttackSense

public class AttackSense : MonoBehaviour
{private static AttackSense instance;public static AttackSense Instance{get{if (instance == null)instance = FindObjectOfType<AttackSense>(); // 查找當(dāng)前場(chǎ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)前沒(méi)有進(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ī)偏移一定范圍來(lái)模擬震動(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)畫(huà)前先設(shè)置慢動(dòng)作animator.speed = slowMotionTimeScale;// 等待攻擊動(dòng)畫(huà)播放完成yield return new WaitForSeconds(animator.GetCurrentAnimatorStateInfo(0).length / slowMotionTimeScale);// 恢復(fù)正常時(shí)間縮放animator.speed = 1f;}
}

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

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

參考

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

源碼

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

完結(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

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

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

相關(guān)文章:

  • wordpress特色圖片dz論壇seo
  • wordpress無(wú)法更改主題北京網(wǎng)站優(yōu)化服務(wù)
  • 怎么做免流網(wǎng)站seo的優(yōu)點(diǎn)和缺點(diǎn)
  • rss 網(wǎng)站插件企業(yè)網(wǎng)站優(yōu)化
  • 本科學(xué)計(jì)算機(jī)是做網(wǎng)站嗎搜索引擎優(yōu)化服務(wù)
  • 做購(gòu)物網(wǎng)站需要什么服務(wù)器拼多多代運(yùn)營(yíng)收費(fèi)標(biāo)準(zhǔn)
  • 做個(gè)平臺(tái)網(wǎng)站怎么做自己有產(chǎn)品怎么網(wǎng)絡(luò)銷售
  • 做自己網(wǎng)站彩票網(wǎng)站設(shè)計(jì)公司排行
  • 珠海有什么網(wǎng)站網(wǎng)址導(dǎo)航哪個(gè)好
  • 網(wǎng)易企業(yè)郵箱忘記密碼seo零基礎(chǔ)視頻教程
  • 如何做免費(fèi)企業(yè)網(wǎng)站網(wǎng)站優(yōu)化策略分析
  • 中國(guó)最早做網(wǎng)站是誰(shuí)關(guān)鍵詞工具軟件
  • 電子商務(wù)網(wǎng)站的運(yùn)營(yíng)一般需要做哪些準(zhǔn)備企業(yè)官網(wǎng)建站
  • 辦公室裝修注意事項(xiàng)及細(xì)節(jié)整站優(yōu)化系統(tǒng)廠家
  • 幫人做網(wǎng)站犯法想做網(wǎng)絡(luò)推廣的公司
  • 租個(gè)網(wǎng)站服務(wù)器多少錢高端網(wǎng)站建設(shè)案例
  • 瀝林行業(yè)網(wǎng)站建設(shè)百度官方網(wǎng)平臺(tái)
  • 北京開(kāi)發(fā)區(qū)建設(shè)委員會(huì)網(wǎng)站資格網(wǎng)絡(luò)營(yíng)銷軟件大全
  • 南昌大型網(wǎng)站建設(shè)公司2023年8月份新冠癥狀
  • 建設(shè)銀行軟件官方網(wǎng)站下載百度客服系統(tǒng)
  • 如何建設(shè)購(gòu)物網(wǎng)站seo培訓(xùn)多少錢
  • 做公司的網(wǎng)站有哪些東西嗎網(wǎng)站加速
  • 教育機(jī)構(gòu)電商網(wǎng)站建設(shè)加盟seo英文
  • 油漆網(wǎng)站設(shè)計(jì)株洲網(wǎng)絡(luò)推廣
  • 書(shū)籍網(wǎng)站設(shè)計(jì)寧波網(wǎng)站推廣公司有哪些
  • 湖南網(wǎng)站設(shè)計(jì)公司西安優(yōu)化seo
  • 做像淘寶網(wǎng)的網(wǎng)站重慶森林講了什么故事
  • 發(fā)布課程的網(wǎng)站模板百度授權(quán)代理商
  • 佛山網(wǎng)站建設(shè)兼職今天剛剛發(fā)生的新聞事故
  • 網(wǎng)站建設(shè)扁平化深圳百度網(wǎng)站排名優(yōu)化