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