我是 Unity 新輸入系統的新手,我最近將我的專案從舊輸入系統遷移到新輸入系統,但我在使用它時遇到了一些困難。
我有一個名為的類InputManager
來管理我的游戲的所有輸入操作,還有一個名為的類PlayerInteractions
來保存所有玩家的互動,例如拾取物體、打開和關閉抽屜/門等。
playerInteraction
類在使用舊輸入系統時運行良好,但是當我將其更改為新輸入系統時,我無法正確處理函式呼叫,因此它不能完全運行。我設法使拾取物體作業,但打開/關閉部分不起作用,因為為此我從一個名為的類中呼叫另一個函式,該函式InteractiveObjects
附加到所有可以打開/關閉的物件,例如門/抽屜.. .
我很難處理這些函式呼叫,因為我對新輸入系統不夠好。
這是一個片段PlayerInteractions Class
private InteractiveObjects interactiveObjects;
bool PickingUp, Open;
void Update()
{
raycastPos = mainCamera.ScreenToWorldPoint(new Vector3(Screen.width / 2, Screen.height / 2, 0));
RaycastHit hit;
if (Physics.SphereCast(raycastPos, sphereCastRadius, mainCamera.transform.forward, out hit, maxDistance, 1 << interactableLayerIndex))
{
lookObject = hit.collider.transform.gameObject;
}
else
{
lookObject=null;
}
if (PickingUp)
{
if (currentlyPickedUpObject == null)
{
if (lookObject != null)
{
PickupObject();
}
}
else
{
BreakConnection();
}
}
PickingUp = false;
if (hit.transform)
{
interactiveObjects = hit.transform.GetComponent<InteractiveObjects>();
}
else
{
lookObject = null;
interactiveObjects = null;
}
if (Open)
{
if (interactiveObjects)
{
interactiveObjects.PerformAction();
}
}
Open = false;
}
public void OnPickingUp()
{
PickingUp = true;
}
public void OnOpen()
{
Open = true;
}
這部分來自上面:
if (Open)
{
if (interactiveObjects)
{
interactiveObjects.PerformAction();
}
}
是這樣的:
if (Input.GetKeyDown(KeyCode.E))
{
if (interactiveObjects)
{
interactiveObjects.PerformAction();
}
}
InteractiveObject
課程是這樣的:
public void PerformAction()
{
if (aSource)
{
aSource.Play();
}
if (Input.GetKeyDown(KeyCode.E))
{
if (isOpen)
{
iTweenArgs["position"] = closedPosition;
iTweenArgs["rotation"] = closedPosition;
}
else
{
iTweenArgs["position"] = openPosition;
iTweenArgs["rotation"] = openPosition;
}
isOpen = !isOpen;
switch(movementType)
{
case MovementType.Slide:
iTween.MoveTo(gameObject, iTweenArgs);
break;
case MovementType.Rotate:
iTween.RotateTo(gameObject, iTweenArgs);
break;
}
}
if(Input.GetKeyDown(KeyCode.E))
已更改為if (Open)
.
這是更改后的完整IneractiveObject
課程:
public class InteractiveObjects : MonoBehaviour
{
[SerializeField] private Vector3 openPosition, closedPosition;
[SerializeField] private float animationTime;
[SerializeField] private bool isOpen = false;
[SerializeField] private MovementType movementType;
bool Open;
private enum MovementType { Slide, Rotate };
private Hashtable iTweenArgs;
private AudioSource aSource;
void Start()
{
iTweenArgs = iTween.Hash();
iTweenArgs.Add("position", openPosition);
iTweenArgs.Add("time", animationTime);
iTweenArgs.Add("islocal", true);
aSource = GetComponent<AudioSource>();
}
public void PerformAction()
{
if (aSource)
{
aSource.Play();
}
if (Open)
{
if (isOpen)
{
iTweenArgs["position"] = closedPosition;
iTweenArgs["rotation"] = closedPosition;
}
else
{
iTweenArgs["position"] = openPosition;
iTweenArgs["rotation"] = openPosition;
}
isOpen = !isOpen;
switch (movementType)
{
case MovementType.Slide:
iTween.MoveTo(gameObject, iTweenArgs);
break;
case MovementType.Rotate:
iTween.RotateTo(gameObject, iTweenArgs);
break;
}
}
Open = false;
}
public void OnOpen()
{
Open = true;
}
}
這是我的輸入操作:
InputManager
班級:
public class InputManager : MonoBehaviour
{
[SerializeField] Movement movement;
[SerializeField] PlayerInteractions playerInteractions;
[SerializeField] MouseLook mouseLook;
PlayerControls controls;
PlayerControls.GroundMovementActions groundMovement;
Vector2 horizontalInput;
Vector2 mouseInput;
private void Awake()
{
controls = new PlayerControls();
groundMovement = controls.GroundMovement;
// groundMovement.[action].performed = context => do something
groundMovement.HorizontalMovement.performed = ctx => horizontalInput = ctx.ReadValue<Vector2>();
groundMovement.Jump.performed = _ => movement.OnJumpPressed();
groundMovement.Running.performed = _ => movement.OnRunning();
groundMovement.PickingUp.performed = _ => playerInteractions.OnPickingUp();
groundMovement.MouseX.performed = ctx => mouseInput.x = ctx.ReadValue<float>();
groundMovement.MouseY.performed = ctx => mouseInput.y = ctx.ReadValue<float>();
groundMovement.Open.performed = _ => playerInteractions.OnOpen();
}
private void Update()
{
movement.ReceiveInput(horizontalInput);
mouseLook.ReceiveInput(mouseInput);
}
private void OnEnable()
{
controls.Enable();
}
private void OnDestroy()
{
controls.Disable();
}
}
因此,InputManager
該類正在呼叫一個函式,playerInteractions
該函式也從中呼叫一個函式以InteractiveObjects
用于打開/關閉功能。這對我不起作用,但我不知道如何解決這個問題。請幫忙。
uj5u.com熱心網友回復:
解決方案就在這里,您不再需要Open
布林值,您可以直接通過新的輸入系統呼叫該函式。對于這份作業;僅輸入 if on 的內容OnOpen
。
public void OnOpen()
{
if (isOpen)
{
iTweenArgs["position"] = closedPosition;
iTweenArgs["rotation"] = closedPosition;
}
else
{
iTweenArgs["position"] = openPosition;
iTweenArgs["rotation"] = openPosition;
}
isOpen = !isOpen;
switch(movementType)
{
case MovementType.Slide:
iTween.MoveTo(gameObject, iTweenArgs);
break;
case MovementType.Rotate:
iTween.RotateTo(gameObject, iTweenArgs);
break;
}
}
這不僅簡化了代碼的結構。相反,它可以防止 if 條件在更新中重復。現在OnOpen
按您設定的B鍵運行:
controls.GroundMovement.Open.performed = _ => playerInteraction.OnOpen();
條件如何連續作業?
有幾種方法可以構建連續作業的函式。Func<bool>
這是一個通過在目標物件腳本中定義來作業的示例:
public class PlayerInteraction : MonoBehaviour
{
public Func<bool> IsPressingOpen;
public void Update()
{
if (IsPressingOpen())
{
// do something...
}
}
}
根據以下結果設定功能就足夠了key pressing
:
playerInteraction.IsPressingOpen = () => controls.GroundMovement.Open.IsPressed();
希望這個答案是全面和實用的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/477593.html
標籤:unity3d