unity2D限制位置的背景移动补偿效果
生活随笔
收集整理的這篇文章主要介紹了
unity2D限制位置的背景移动补偿效果
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
有時候我們想要背景可以跟隨相機移動補償,但是又不想該背景物體離原來的位置太遠,比如我們想要一棵樹在一個房子的后面,然后使用相機補償使其跟隨移動,達到3D錯覺效果,但是我們又不想該物體偏離房屋太遠。假設使用我上一次博客的方法,我們一開始就從很遠的位置走過來,那么當我門到達房屋的位置時,由于樹一直在運動從而偏離原來的位置很遠,將會看不到樹,所以我們采用了如下的方式:
以物體的初始位置為中心,設置背景物體的運動區域,相機的參考區域;以x軸為例,區域的最左邊為開始邊界,最右邊為結束邊界
當相機位置在相機運動區域中的某一點時,求得其離相機運動區域左邊界的差值,求的該差值與相機運動區域的x的長的比例值。
將該比例乘以物體運動區域的長度,再加上運動區域的左邊界x,即可得到物體的應該到達的位置。
當相機的位置小于左邊界,比例值為0;大于右邊界時,比例值為1,這樣物體剛好在邊界上。
巧妙的設計相機的參考區域與物體的限制區域剛好為相機的寬度,那么達到當相機剛好看到物體時,看起來物體也正好一起移動的效果
y軸同理
如上圖所示
代碼如下
using System.Collections; using System.Collections.Generic; using UnityEngine;//有位置區域限定的背景物體的參數設置與位置更新//以物體的初始位置為中心,設置背景物體的運動區域,相機的參考區域;以x軸為例,區域的最左邊為開始邊界,最右邊為結束邊界 //當相機位置在相機運動區域中的某一點時,求得其離相機運動區域左邊界的差值,求的該差值與相機運動區域的x的長的比例值。 //將該比例乘以物體運動區域的長度,再加上運動區域的左邊界x,即可得到物體的應該到達的位置。 //當相機的位置小于左邊界,比例值為0;大于右邊界時,比例值為1,這樣物體剛好在邊界上。 //y軸同理public class BackgroundCell : MonoBehaviour {bool isRunning = false;//調試參數public Vector2 moveZone;//物體的運動區域public Vector2 referCameraZone;//相機運動區域Vector3 paraPosition=new Vector3();//位置變量//運動區域存儲float beginX;float endX;float beginY;float endY;//相機區域存儲float beginCameraX;float endCameraX;float beginCameraY;float endCameraY;Vector3 cameraInitPosition;//Testpublic Transform cam;private void Start(){//存儲運動區域的相關值beginX = transform.position.x - moveZone.x / 2;endX = transform.position.x + moveZone.x / 2;beginY = transform.position.y - moveZone.y / 2;endY = transform.position.y + moveZone.y / 2;beginCameraX = transform.position.x - referCameraZone.x / 2;endCameraX = transform.position.x + referCameraZone.x / 2;beginCameraY = transform.position.y - referCameraZone.y / 2;endCameraY = transform.position.y + referCameraZone.y / 2;//可以認為相機的原來的初始位置就是當前物體的初始位置cameraInitPosition = transform.position;//當相機位置和物體初始位置相等,所以變量位置也等于物體的位置paraPosition = transform.position;isRunning = true;}private void Update(){Camera camraddd = cam.GetComponent<Camera>();UpdatePosition(cam.position, 8);}public void UpdatePosition(Vector3 cameraPosition,float smoothing){transform.position = Vector3.Lerp(transform.position,paraPosition,smoothing*Time.deltaTime);//如果相機的位置沒有發生改變,那么不進行物體的位置更新,不執行下面的更新操作if (cameraInitPosition.x == cameraPosition.x && cameraInitPosition.y == cameraPosition.y) return;//存儲相機在此幀的位置cameraInitPosition = cameraPosition;if (cameraPosition.x < beginCameraX) paraPosition.x = beginX;else if (cameraPosition.x > beginCameraX && cameraPosition.x < endCameraX) paraPosition.x = beginX + moveZone.x * ((cameraPosition.x - beginCameraX) / referCameraZone.x);else if (cameraPosition.x > endCameraX) paraPosition.x = endX;if (cameraPosition.y < beginCameraY) paraPosition.y = beginY;else if (cameraPosition.y > beginCameraY && cameraPosition.y < endCameraY) paraPosition.y = beginY + moveZone.y * ((cameraPosition.y - beginCameraY) / referCameraZone.y);else if (cameraPosition.y > endCameraY) paraPosition.y = endY;}private void OnDrawGizmosSelected(){Gizmos.color = Color.cyan;Gizmos.DrawWireCube(transform.position, moveZone);Gizmos.color = Color.yellow;Gizmos.DrawWireCube(transform.position, referCameraZone);} }?
轉載于:https://www.cnblogs.com/xiaoahui/p/10328631.html
總結
以上是生活随笔為你收集整理的unity2D限制位置的背景移动补偿效果的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kylin KV+cube方案分析
- 下一篇: 现金支付没落?澳大利亚一年内移除数百台A