愤怒的小鸟siki学院案例,添加瞄准预测轨迹<五>
生活随笔
收集整理的這篇文章主要介紹了
愤怒的小鸟siki学院案例,添加瞄准预测轨迹<五>
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
添加瞄準預測軌跡
準備借鑒(抄)該前輩的代碼:
《【游戲開發實戰】Unity 2D游戲物理運動曲線軌跡預測,以憤怒的小鳥為例,軌跡曲線云團圈圈》
版權聲明:本文為CSDN博主「林新發」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/linxinfa/article/details/115114589
那篇博文的三個代碼放的比較散,只是舉個樣例小鳥,我這個工程不太好調,就都把相關代碼放到了小鳥的代碼下,雖然比較麻煩,但還是以運行通過為先吧。
這個是變量預設:
[HideInInspector]public Vector3 pos{get { return transform.position; }}[SerializeField]private float m_speedFactor = 4f;private Vector2 m_startPoint;//鼠標開始落點private Vector2 m_endPoint;//鼠標離開點private float m_distance;//鼠標位置差private Vector2 m_direction;private Vector2 m_pushSpeed;//推力速度[SerializeField] private int m_dotsNum = 20;[SerializeField] private GameObject m_dotsParent;[SerializeField] private GameObject m_dotsPrefab;[SerializeField] private float m_dotSpacing = 0.01f;[SerializeField] [Range(0.01f, 0.3f)] private float m_dotMinScale = 0.1f;[SerializeField] [Range(0.3f, 1f)] private float m_dotMaxScale = 1f;private Transform[] m_dotsList;private Vector2 m_pos;private float m_timeStamp;主要看左邊
public void Push(Vector2 speed){rg.AddForce(speed, ForceMode2D.Impulse);//推力}private void OnMouseDown()//鼠標按下{if (canMove){AudioPlay(select);//添加音效isClick = true;rg.isKinematic = true;//使開啟動力學功能PrepareDots();OnDragStart();}}private void OnMouseUp()//鼠標抬起{if (canMove){isClick = false;rg.isKinematic = false;//使開啟動力學功能失活Invoke("Fly", 0.1f);//延遲函數Invoke//畫線啟用功能禁止right.enabled = false;left.enabled = false;canMove = false;//使小鳥僅能飛行一次,在鼠標抬起后該bool變量為falseOnDragEnd();}}private void Update()//循環,轉換坐標并畫線{OnDrag();}主代碼:基本上是借鑒(抄)那篇博文的,我簡化到一個代碼文件里了
private void OnDragStart()//鼠標按下小鳥不放{// 禁用物理rg.velocity = Vector3.zero;rg.angularVelocity = 0f;rg.isKinematic = true;// 起始點m_startPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);//轉換鼠標落點的坐標// 顯示軌跡Show();}/// <summary>/// 拉中/// </summary>private void OnDrag()//鼠標按下小鳥不放,持續時間,顯示軌跡{m_endPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);//轉換鼠標離開時的坐標m_distance = Vector2.Distance(m_startPoint, m_endPoint);//距離差m_direction = (m_startPoint - m_endPoint).normalized;//標準單位化 方向m_pushSpeed = m_direction * m_distance * m_speedFactor;//*4UpdateDots(transform.position, m_pushSpeed);//準備點}/// <summary>/// 拉結束/// </summary>private void OnDragEnd(){rg.isKinematic = false;Push(m_pushSpeed);sp.enabled = false;// 隱藏軌跡Hide();}private void PrepareDots()//準備軌跡點{m_dotsList = new Transform[m_dotsNum];m_dotsPrefab.transform.localScale = Vector3.one * m_dotMaxScale;float scale = m_dotMaxScale;float scaleFactor = scale / m_dotsNum;for (int i = 0; i < m_dotsNum; ++i){var dot = Instantiate(m_dotsPrefab).transform;dot.parent = m_dotsParent.transform;//父節點的位置dot.localScale = Vector3.one * scale;if (scale > m_dotMinScale)scale -= scaleFactor;m_dotsList[i] = dot;}}public void UpdateDots(Vector2 birdPos, Vector2 pushSpeed){m_timeStamp = m_dotSpacing;for (int i = 0; i < m_dotsNum; ++i){m_pos.x = birdPos.x + pushSpeed.x * m_timeStamp;m_pos.y = (birdPos.y + pushSpeed.y * m_timeStamp) - 0.5f * Physics2D.gravity.magnitude * m_timeStamp * m_timeStamp;m_dotsList[i].position = m_pos;m_timeStamp += m_dotSpacing;}}public void Show(){m_dotsParent.SetActive(true);//父節點的所有功能開啟,顯示父節點,即顯示整個預測軌跡}public void Hide(){m_dotsParent.SetActive(false);//父節點的所有功能關閉,不顯示父節點,即不顯示整個預測軌跡}那篇博文的父節點和點預設,提的不是很清楚,后來我理解了一下:
我把每只鳥的坐標都賦值給了一個空的子物體,并且把這個子物體又賦值給了鳥掛的腳本的dots parent,這樣就可以實時跟著鳥的位置產生軌跡點。
另外,由于我憤怒的小鳥是有彈簧組件的,所以那篇博文用的方法不太適合我的工程,他的動力來源于鼠標落點和離開點的距離差,所以加入它的代碼,我這個系統的動力會大一部分,這就不太好取舍了,所以我用了最簡單的辦法:增加小鳥的質量,我從0.5調到了0.98,剛剛好和小鳥預測軌跡完美重合。
總結
以上是生活随笔為你收集整理的愤怒的小鸟siki学院案例,添加瞄准预测轨迹<五>的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MATLAB之怎样利用MATLAB中值差
- 下一篇: 管理类联考计算机,管理类联考逻辑能力提高