[英]Disabling camera movement and unlocking cursor on enabling pause menu in Unity
TLDR:嘗試實現:
前言:我的腳本/編碼經驗為零。
我是一所M.Des藝術學校的學生,由於目前無法進行個人安裝,因此我想為我的碩士研究項目制作一個(第一人稱)虛擬藝術安裝。 我已經設法通過使用教程和Internet上的粘貼粘貼腳本來構建游戲的大部分內容,但是我遇到了一些我認為需要一些特定腳本編寫的東西,但我做不到。
基本上,我已經創建了一個暫停菜單(使用Brackeys的暫停菜單教程),但是即使在菜單中,相機仍會繼續移動。 我發現有多個線程和問題可以解決此問題,但是它們要么假設一定程度的腳本知識,要么似乎不應用於我的相機運動腳本-我不是一個狂熱者,所以我粘貼了一個“平滑的鼠標外觀”腳本其他腳本的機器人攝影機運動。
我也不確定如何為暫停菜單解鎖光標。 任何幫助將不勝感激,但是正如我所說,請知道我對腳本的了解本質上是一無所有! 我很想花時間學習,但是時間是我目前沒有太多時間,需要集中精力為裝置創作藝術作品。
以下是暫停菜單和攝像機移動腳本:
暫停菜單:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PauseMenu : MonoBehaviour
{
public static bool GameIsPaused = false;
public GameObject pauseMenuUI;
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Return))
{
if (GameIsPaused)
{
Resume();
}
else
{
Pause();
}
}
}
public void Resume()
{
pauseMenuUI.SetActive(false);
Time.timeScale = 1f;
GameIsPaused = false;
}
void Pause()
{
pauseMenuUI.SetActive(true);
Time.timeScale = 0f;
GameIsPaused = true;
}
public void LoadMenu()
{
Debug.Log("Loading Game...");
}
public void QuitGame()
{
Debug.Log("Quitting Game...");
}
}
相機運動:
using UnityEngine;
[AddComponentMenu("Camera/Simple Smooth Mouse Look ")]
public class SimpleSmoothMouseLook : MonoBehaviour
{
Vector2 _mouseAbsolute;
Vector2 _smoothMouse;
public Vector2 clampInDegrees = new Vector2(360, 180);
public bool lockCursor;
public Vector2 sensitivity = new Vector2(2, 2);
public Vector2 smoothing = new Vector2(3, 3);
public Vector2 targetDirection;
public Vector2 targetCharacterDirection;
// Assign this if there's a parent object controlling motion, such as a Character Controller.
// Yaw rotation will affect this object instead of the camera if set.
public GameObject characterBody;
void Start()
{
// Set target direction to the camera's initial orientation.
targetDirection = transform.localRotation.eulerAngles;
// Set target direction for the character body to its inital state.
if (characterBody)
targetCharacterDirection = characterBody.transform.localRotation.eulerAngles;
}
void Update()
{
// Ensure the cursor is always locked when set
if (lockCursor)
{
Cursor.lockState = CursorLockMode.Locked;
}
// Allow the script to clamp based on a desired target value.
var targetOrientation = Quaternion.Euler(targetDirection);
var targetCharacterOrientation = Quaternion.Euler(targetCharacterDirection);
// Get raw mouse input for a cleaner reading on more sensitive mice.
var mouseDelta = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y"));
// Scale input against the sensitivity setting and multiply that against the smoothing value.
mouseDelta = Vector2.Scale(mouseDelta, new Vector2(sensitivity.x * smoothing.x, sensitivity.y * smoothing.y));
// Interpolate mouse movement over time to apply smoothing delta.
_smoothMouse.x = Mathf.Lerp(_smoothMouse.x, mouseDelta.x, 1f / smoothing.x);
_smoothMouse.y = Mathf.Lerp(_smoothMouse.y, mouseDelta.y, 1f / smoothing.y);
// Find the absolute mouse movement value from point zero.
_mouseAbsolute += _smoothMouse;
// Clamp and apply the local x value first, so as not to be affected by world transforms.
if (clampInDegrees.x < 360)
_mouseAbsolute.x = Mathf.Clamp(_mouseAbsolute.x, -clampInDegrees.x * 0.5f, clampInDegrees.x * 0.5f);
// Then clamp and apply the global y value.
if (clampInDegrees.y < 360)
_mouseAbsolute.y = Mathf.Clamp(_mouseAbsolute.y, -clampInDegrees.y * 0.5f, clampInDegrees.y * 0.5f);
transform.localRotation = Quaternion.AngleAxis(-_mouseAbsolute.y, targetOrientation * Vector3.right) * targetOrientation;
// If there's a character body that acts as a parent to the camera
if (characterBody)
{
var yRotation = Quaternion.AngleAxis(_mouseAbsolute.x, Vector3.up);
characterBody.transform.localRotation = yRotation * targetCharacterOrientation;
}
else
{
var yRotation = Quaternion.AngleAxis(_mouseAbsolute.x, transform.InverseTransformDirection(Vector3.up));
transform.localRotation *= yRotation;
}
}
}
謝謝!
TLDR:嘗試實現:
前言:我的腳本/編碼經驗為零。
我是一所M.Des藝術學校的學生,由於目前無法進行個人安裝,因此我想為我的碩士研究項目制作一個(第一人稱)虛擬藝術安裝。 我已經設法通過使用教程和Internet上的粘貼粘貼腳本來構建游戲的大部分內容,但是我遇到了一些我認為需要一些特定腳本編寫的東西,但我做不到。
基本上,我已經創建了一個暫停菜單(使用Brackeys的暫停菜單教程),但是即使在菜單中,相機仍會繼續移動。 我發現有多個線程和問題可以解決此問題,但是它們要么假設一定程度的腳本知識,要么似乎不應用於我的相機運動腳本-我不是一個狂熱者,所以我粘貼了一個“平滑的鼠標外觀”腳本其他腳本的機器人攝影機運動。
我也不確定如何為暫停菜單解鎖光標。 任何幫助將不勝感激,但是正如我所說,請知道我對腳本的了解本質上是一無所有! 我很想花時間學習,但是時間是我目前沒有太多時間,需要集中精力為裝置創作藝術作品。
以下是暫停菜單和攝像機移動腳本:
暫停菜單:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PauseMenu : MonoBehaviour
{
public static bool GameIsPaused = false;
public GameObject pauseMenuUI;
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Return))
{
if (GameIsPaused)
{
Resume();
}
else
{
Pause();
}
}
}
public void Resume()
{
pauseMenuUI.SetActive(false);
Time.timeScale = 1f;
GameIsPaused = false;
}
void Pause()
{
pauseMenuUI.SetActive(true);
Time.timeScale = 0f;
GameIsPaused = true;
}
public void LoadMenu()
{
Debug.Log("Loading Game...");
}
public void QuitGame()
{
Debug.Log("Quitting Game...");
}
}
相機運動:
using UnityEngine;
[AddComponentMenu("Camera/Simple Smooth Mouse Look ")]
public class SimpleSmoothMouseLook : MonoBehaviour
{
Vector2 _mouseAbsolute;
Vector2 _smoothMouse;
public Vector2 clampInDegrees = new Vector2(360, 180);
public bool lockCursor;
public Vector2 sensitivity = new Vector2(2, 2);
public Vector2 smoothing = new Vector2(3, 3);
public Vector2 targetDirection;
public Vector2 targetCharacterDirection;
// Assign this if there's a parent object controlling motion, such as a Character Controller.
// Yaw rotation will affect this object instead of the camera if set.
public GameObject characterBody;
void Start()
{
// Set target direction to the camera's initial orientation.
targetDirection = transform.localRotation.eulerAngles;
// Set target direction for the character body to its inital state.
if (characterBody)
targetCharacterDirection = characterBody.transform.localRotation.eulerAngles;
}
void Update()
{
// Ensure the cursor is always locked when set
if (lockCursor)
{
Cursor.lockState = CursorLockMode.Locked;
}
// Allow the script to clamp based on a desired target value.
var targetOrientation = Quaternion.Euler(targetDirection);
var targetCharacterOrientation = Quaternion.Euler(targetCharacterDirection);
// Get raw mouse input for a cleaner reading on more sensitive mice.
var mouseDelta = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y"));
// Scale input against the sensitivity setting and multiply that against the smoothing value.
mouseDelta = Vector2.Scale(mouseDelta, new Vector2(sensitivity.x * smoothing.x, sensitivity.y * smoothing.y));
// Interpolate mouse movement over time to apply smoothing delta.
_smoothMouse.x = Mathf.Lerp(_smoothMouse.x, mouseDelta.x, 1f / smoothing.x);
_smoothMouse.y = Mathf.Lerp(_smoothMouse.y, mouseDelta.y, 1f / smoothing.y);
// Find the absolute mouse movement value from point zero.
_mouseAbsolute += _smoothMouse;
// Clamp and apply the local x value first, so as not to be affected by world transforms.
if (clampInDegrees.x < 360)
_mouseAbsolute.x = Mathf.Clamp(_mouseAbsolute.x, -clampInDegrees.x * 0.5f, clampInDegrees.x * 0.5f);
// Then clamp and apply the global y value.
if (clampInDegrees.y < 360)
_mouseAbsolute.y = Mathf.Clamp(_mouseAbsolute.y, -clampInDegrees.y * 0.5f, clampInDegrees.y * 0.5f);
transform.localRotation = Quaternion.AngleAxis(-_mouseAbsolute.y, targetOrientation * Vector3.right) * targetOrientation;
// If there's a character body that acts as a parent to the camera
if (characterBody)
{
var yRotation = Quaternion.AngleAxis(_mouseAbsolute.x, Vector3.up);
characterBody.transform.localRotation = yRotation * targetCharacterOrientation;
}
else
{
var yRotation = Quaternion.AngleAxis(_mouseAbsolute.x, transform.InverseTransformDirection(Vector3.up));
transform.localRotation *= yRotation;
}
}
}
謝謝!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.