List版本(適用數量較少) ```C#= [SerializeField] List<Transform> npcList;//儲存不同npc [SerializeField] float interactRange; float dist; private void Start() { dist = 0f; } private void Update() { if (Keyboard.current.eKey.wasPressedThisFrame) { dist = Vector3.Distance(transform.position, npcList[0].transform.position);//Vector3.Distance(disA,disB) 計算兩者距離用 print("Distance to other: " + dist); if (dist < interactRange) { Debug.Log("hi:"); } } } ``` ----------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------- Unity官方StarterAsset-First Person Character Controller的sdk ```C#= using UnityEngine; #if ENABLE_INPUT_SYSTEM using UnityEngine.InputSystem; #endif namespace StarterAssets { public class StarterAssetsInputs : MonoBehaviour { [Header("Character Input Values")] public Vector2 move; public Vector2 look; public bool jump; public bool sprint; public bool interact; [Header("Movement Settings")] public bool analogMovement; [Header("Mouse Cursor Settings")] public bool cursorLocked = true; public bool cursorInputForLook = true; #if ENABLE_INPUT_SYSTEM public void OnMove(InputValue value) { MoveInput(value.Get<Vector2>()); } public void OnLook(InputValue value) { if(cursorInputForLook) { LookInput(value.Get<Vector2>()); } } public void OnJump(InputValue value) { JumpInput(value.isPressed); } public void OnSprint(InputValue value) { SprintInput(value.isPressed); } //Interact public void OnInteract(InputValue value) { InteractInput(value.isPressed); Debug.Log("E"); } #endif public void MoveInput(Vector2 newMoveDirection) { move = newMoveDirection; } public void LookInput(Vector2 newLookDirection) { look = newLookDirection; } public void JumpInput(bool newJumpState) { jump = newJumpState; } public void SprintInput(bool newSprintState) { sprint = newSprintState; } //Interact public void InteractInput(bool newInteractState) { interact = newInteractState; } private void OnApplicationFocus(bool hasFocus) { SetCursorState(cursorLocked); } private void SetCursorState(bool newState) { Cursor.lockState = newState ? CursorLockMode.Locked : CursorLockMode.None; } } } ``` 事件綁定互動 ```C#= using StarterAssets; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; using static UnityEngine.Rendering.DebugUI; public class PlayerInteraction : MonoBehaviour { [SerializeField] List<Transform> npcList; [SerializeField] float interactRange; float dist; private StarterAssetsInputs starterAssetsInputs;// script private void Start() { dist = 0f; starterAssetsInputs = GetComponent<StarterAssetsInputs>(); } private void Update() { Interact(); } private void Interact()//Interact action { dist = Vector3.Distance(transform.position, npcList[0].transform.position); if (dist < interactRange && starterAssetsInputs != null && starterAssetsInputs.interact) { print("Distance to other: " + dist); Debug.Log("hi:"); //互動寫在這裡 } } } ``` 事件綁定互動但用phisic system判定。 (Event條件調用沒有寫好,應該要能直接調用Interact()而不是寫成需要Getcomponment的布林判斷式,不須存取input的互動物件會沒辦法觸發) ```C#= using StarterAssets; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; using static UnityEngine.Rendering.DebugUI; public class PlayerInteraction : MonoBehaviour { [SerializeField] float interactRange; private StarterAssetsInputs starterAssetsInputs;// script void Awake() { interactRange = 2f; } void Start() { starterAssetsInputs = GetComponent<StarterAssetsInputs>();//event input script } void Update() { Interact(); } void Interact()//Interact action { if (starterAssetsInputs != null && starterAssetsInputs.interact) { print("Distance to other: "); //區域內物理偵測到的,與先宣告list相同 Collider [ ]colliderArray= Physics.OverlapSphere(transform.position, interactRange);//(center, radius,mask) foreach(Collider collider in colliderArray) { Debug.Log(collider); } //互動寫在這裡 } } } ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up