Sandbox Finger control log 3 + WebGL test

Sandbox Finger control log 3 + WebGL test

http://clonefactor.com/20171230_DaughterSandbox_Data/

Demo record :

在物理測試中,unity3D人物的ragdoll 設定其實很簡陋, 看來要做一個自然的死屍也有一定的功夫要做.

也順道分享一個簡單的攝像頭寫法, 因為測試時希望快速進入 Game Mode 而又懶惰的關係.
所以預先做好了跟 Unity3D 有 80% 相似的鏡頭動作 Script,
需要時直接放到 Camera 元件上即可. 平台是 PC + Editor 限定.

又沒有達到可以發售的程度所以直接在這邊公開分享算了.
有用處的隨便, 有建議的也歡迎提點一下 (e.g. 手機支持等等….)

Known bugs:

好像在 WebGL 環境需要 Right + 任何其他鍵才能夠成功觸發. 原因應該是 HTML 的 context menu. 不過那是系統的 bug.

ObserverMovement.cs

 

using UnityEngine;
using UnityEngine.Networking;

namespace Kit
{
	public class ObserverMovement : MonoBehaviour
	{
		[Header("Common")]
		public float m_Speed = 0.5f;
		public float m_HighSpeed = 2f;

		[Header("Optional")]
		public NetworkIdentity m_NetworkIdentity;
		public Camera m_Camera;

		private float m_CurrentSpeed = 0f;
		private bool m_ToggleSpeed = false;
		private Vector3 m_LocalTranslate = Vector3.zero;
		private Vector2 m_LocalLook = Vector2.zero;

		void OnValidate()
		{
			if (m_NetworkIdentity == null)
			{
				m_NetworkIdentity = GetComponent<NetworkIdentity>();
			}

			if (m_NetworkIdentity != null)
			{
				if (m_Camera == null)
					m_Camera = GetComponentInChildren<Camera>(true);
			}
		}
		
		void InputUpdate()
		{
			// Mouse look
			if ((Input.GetMouseButton(1) || Input.GetMouseButton(2)) &&
				Cursor.lockState != CursorLockMode.Locked)
			{
				Cursor.lockState = CursorLockMode.Locked;
			}
			if ((Input.GetMouseButtonUp(1) || Input.GetMouseButtonUp(2)) &&
				Cursor.lockState != CursorLockMode.None)
			{
				Cursor.lockState = CursorLockMode.None;
			}

			if (Cursor.lockState == CursorLockMode.Locked)
			{
				m_LocalLook.x = -Input.GetAxis("Mouse Y");
				m_LocalLook.y = Input.GetAxis("Mouse X");
			}

			// Speed
			if (!m_ToggleSpeed &&
				Input.GetKeyDown(KeyCode.LeftShift) || Input.GetKeyDown(KeyCode.RightShift))
			{
				m_ToggleSpeed = true;
			}
			else if (m_ToggleSpeed &&
				(Input.GetKeyUp(KeyCode.LeftShift) || Input.GetKeyUp(KeyCode.RightShift)) &&
				!(Input.GetKey(KeyCode.LeftShift) && Input.GetKey(KeyCode.RightShift)))
			{
				m_ToggleSpeed = false;
			}
			m_CurrentSpeed = (m_ToggleSpeed) ? m_HighSpeed : m_Speed;

			// Movement
			if (Input.GetAxis("Vertical") != 0)
			{
				m_LocalTranslate += transform.forward * m_CurrentSpeed * Input.GetAxis("Vertical");
			}
			if (Input.GetAxis("Horizontal") != 0)
			{
				m_LocalTranslate += transform.right * m_CurrentSpeed * Input.GetAxis("Horizontal");
			}

			if (Input.GetKey(KeyCode.E) && !Input.GetKey(KeyCode.Q))
			{
				m_LocalTranslate += transform.up * m_CurrentSpeed * 0.5f;
			}
			if (Input.GetKey(KeyCode.Q) && !Input.GetKey(KeyCode.E))
			{
				m_LocalTranslate += -transform.up * m_CurrentSpeed * 0.5f;
			}
		}

		void Update()
		{
			if (m_NetworkIdentity != null && !m_NetworkIdentity.isLocalPlayer)
			{
				NetworkNPCUpdate();
			}
			else
			{
				LocalPlayerUpdate();
			}
		}

		void NetworkNPCUpdate()
		{
			if (m_Camera != null)
				m_Camera.enabled = false;
		}

		void LocalPlayerUpdate()
		{
			InputUpdate();

			// Apply
			transform.Translate(m_LocalTranslate, Space.World);
			if (Cursor.lockState == CursorLockMode.Locked)
			{
				transform.Rotate(Vector3.right, m_LocalLook.x, Space.Self);
				transform.Rotate(Vector3.up, m_LocalLook.y, Space.World);
			}

			// Reset
			m_LocalTranslate = Vector3.zero;
			m_LocalLook = Vector2.zero;
		}
	}
}

 

 

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料