我嘗試根據房間減壓的方法在房間之間移動氧氣,但沒有奏效。如果你能解釋邏輯,我將不勝感激,最好是用例子。我在房間里有觸發器區域。該按鈕創建一個觸發器,用于切換觸發方法的布林值。我為大量的代碼道歉,我已經完全迷路了,不知道該怎么辦......
房間等級:
public class Room : MonoBehaviour
{
[Foldout("Oxygen")] [Range(0.0f, 100.0f)]
public float room_curOxygen = 100f, room_maxOxygen = 100f, room_maxRemovedOxygen = 100f;
[Foldout("Stats multipliers")] [Range(0, 25)]
public int room_addOxygenStep, room_decreaseOxygenStep;
[ReadOnly]
public float room_minOxygen, room_minRemovedOxygen = 0f;
public float decreaseCurrentAvg;
public float room_removedOxygen;
private GameObject player;
private CharacterController characterController;
public GameObject roomUI;
private TMP_Text roomUI_oxygenLevelText, roomUI_removedOxygen;
public bool isRoomContainsOxygen;
public bool isOxygenDecreasing = false;
public bool canTransfer = false;
public OxygenTrigger oxygenTrigger;
void Start()
{
roomUI_oxygenLevelText = roomUI.GetComponent<RoomUI>().oxygenLevelText;
roomUI_removedOxygen = roomUI.GetComponent<RoomUI>().removedOxygenText;
player = GameObject.FindGameObjectWithTag("Player");
characterController = player.GetComponent<CharacterController>();
}
void Update()
{
if (room_curOxygen > 0)
{
isRoomContainsOxygen = true;
}
else
{
isRoomContainsOxygen = false;
}
}
private void OnTriggerStay(Collider other)
{
if (other.gameObject.tag == "Player")
{
characterController.inRoom = true;
}
}
private void OnTriggerExit(Collider other)
{
if (other.gameObject.tag == "Player")
{
characterController.inRoom = false;
}
}
按鈕類:
public class InteractableButton : MonoBehaviour
{
public bool open = false;
private Animator doorAnimator;
public GameObject prefab_oxygenTrigger, triggersSpawnPoint;
private GameObject instOxygenTrigger;
private GameObject roomZone;
private Room room;
private void Start()
{
doorAnimator = transform.parent.GetComponent<Animator>();
roomZone = transform.parent.transform.parent.gameObject.transform.GetChild(1).gameObject;
room = roomZone.GetComponent<Room>();
}
public void DoorFunc()
{
bool alreadyChecked = false;
if (open) //closing door
{
doorAnimator.SetBool("doorOpened", false);
open = false;
alreadyChecked = true;
Destroy(instOxygenTrigger);
room.isOxygenDecreasing = false;
print($"<color=#CE7E00>Room oxygen ADD!</color>");
}
if (!open && !alreadyChecked) //opening door
{
doorAnimator.SetBool("doorOpened", true);
open = true;
instOxygenTrigger = Instantiate(prefab_oxygenTrigger, triggersSpawnPoint.transform);
print($"<color=#CE7E00>Room oxygen DECREASING!</color>");
}
}
}
OxygenTrigger 類:
public class OxygenTrigger : MonoBehaviour
{
IEnumerator room_decreaseOxygen, room_addOxygen;
private GameObject roomZone;
private GameObject contactedRoomZone;
private Room room;
private Room contactedRoom;
void Start()
{
roomZone = transform.parent.transform.parent.gameObject;
room = roomZone.GetComponent<Room>();
}
private void Update()
{
if (room.canTransfer) TransferOxygen();
}
private void OnTriggerEnter(Collider other)
{
if(other.gameObject.tag == "openZone")
{
room.isOxygenDecreasing = true;
}
if(other.gameObject.tag == "roomZone")
{
contactedRoom = other.gameObject.GetComponent<Room>();
room.isOxygenDecreasing = true;
contactedRoom.isOxygenDecreasing = true;
print(contactedRoom.name);
room.canTransfer = true;
contactedRoom.canTransfer = true;
}
}
private void OnTriggerExit(Collider other)
{
if(other.gameObject.tag == "roomZone")
{
room.isOxygenDecreasing = false;
room.canTransfer = false;
}
}
public void TransferOxygen()
{
room.room_curOxygen -= contactedRoom.room_curOxygen * Time.deltaTime / 2;
room.room_curOxygen = contactedRoom.room_curOxygen * Time.deltaTime / 2;
contactedRoom.room_curOxygen -= room.room_curOxygen * Time.deltaTime / 2;
contactedRoom.room_curOxygen = room.room_curOxygen * Time.deltaTime / 2;
}
}
uj5u.com熱心網友回復:
盡管有其余的代碼,但有一件事很突出:
您似乎正在在完全相同的房間中添加和洗掉您的值
room.room_curOxygen -= contactedRoom.room_curOxygen * Time.deltaTime / 2;
room.room_curOxygen = contactedRoom.room_curOxygen * Time.deltaTime / 2;
contactedRoom.room_curOxygen -= room.room_curOxygen * Time.deltaTime / 2;
contactedRoom.room_curOxygen = room.room_curOxygen * Time.deltaTime / 2;
在這些行之后,您將獲得與之前完全相同的值(可能帶有一些浮點印象)。
我想您寧愿將其從一個中洗掉并將其添加到另一個中。
首先,作為目標,房間將等于它們的總壓力,因此假設兩個房間的體積相同,例如
var totalOxigen = (room.room_curOxygen contactedRoom.room_curOxygen);
var targetOxigyenPerRoom = total / 2;
或者如果有不同的房間體積,您將需要該資訊來根據其體積/最大氧氣實際計算可用氧氣的相等份額
var roomTargetOxigen = targetOxigyenPerRoom * room.volume / contactedRoom.volume;
var contactedRoomTargetOxigen = targetOxigyenPerRoom * contactedRoom.volume / room.volume;
然后,您必須將當前值移向給定的目標值。例如,您可以以每秒固定的數量線性執行該操作
room.room_curOxygen = Mathf.MoveTowards(room.room_curOxygen, targetOxigyenPerRoom, FIX_MOUNT_PER_SECOND * Tim.deltaTime);
contactedRoom.room_curOxygen = Mathf.MoveTowards(contactedRoom.room_curOxygen, targetOxigyenPerRoom, FIX_MOUNT_PER_SECOND * Tim.deltaTime);
或者簡單地插值,這可能更自然一些,因為更高的壓力差可能會更快地平衡
room.room_curOxygen = Mathf.Lerp(room.room_curOxygen, targetOxigyenPerRoom, 5 * Tim.deltaTime);
contactedRoom.room_curOxygen = Mathf.Lerp(contactedRoom.room_curOxygen, targetOxigyenPerRoom, 5 * Tim.deltaTime);
其中5 * Time.deltaTime實際上是0(完全回傳第一個引數)和1(完全回傳第二個引數)之間的插值因子,5這里非常隨意,您可以根據需要進行調整。更高的值 => 更快的插值。
第二個片段的優點是高差異更快地平衡,并且傳輸變得越來越慢,值越接近目標
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/517266.html
下一篇:在2D中左右移動時無法跳躍
