I've made a Camera script for mobile game that works only in a panel field. The script is working properly on unity Remote 5 but after building the game on my Android, the camera doesn't rotate at all!
I have a joystick and some buttons and they work perfectly after the build.
The Camera script:
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 bool canWork;
public Vector2 sensitivity = new Vector2(2, 2);
public Vector2 smoothing = new Vector2(3, 3);
public Vector2 targetDirection;
public Vector2 targetCharacterDirection;
public Touch touch;
public float StartXArea;
// 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;
canWork = false;
// 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;
}
if (canWork)
{
if (touch.position.x > StartXArea && touch.phase == TouchPhase.Moved)
{
// 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(touch.deltaPosition.x, touch.deltaPosition.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;
}
}
}
}
}
The Panel script (For info, there are three panels):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class fieldTouch : MonoBehaviour
{
public GameObject cam;
public GameObject Panel;
public GameObject PanelTwo;
public GameObject PanelThree;
public int i;
public Touch touch;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
SimpleSmoothMouseLook Script = cam.GetComponent();
i = 0;
while (i < Input.touchCount)
{
touch = Input.GetTouch(i);
if (RectTransformUtility.RectangleContainsScreenPoint(Panel.GetComponent(), touch.position, null) || RectTransformUtility.RectangleContainsScreenPoint(PanelTwo.GetComponent(), touch.position, null) || RectTransformUtility.RectangleContainsScreenPoint(PanelThree.GetComponent(), touch.position, null))
{
Script.canWork = true;
Script.touch = Input.GetTouch(i);
}
else if (RectTransformUtility.RectangleContainsScreenPoint(Panel.GetComponent(), Script.touch.position, null) || RectTransformUtility.RectangleContainsScreenPoint(PanelTwo.GetComponent(), Script.touch.position, null) || RectTransformUtility.RectangleContainsScreenPoint(PanelThree.GetComponent(), Script.touch.position, null))
{
Script.canWork = true;
}
else
{
Script.canWork = false;
}
++i;
}
}
}
So here is my question:
Is there a problem in my scripts?
Does `RectTransformUtility.RectangleContainsScreenPoint` work after the Android build?
Or is this a problem in the player settings?
I'll really appreciate some help, Thanks!
↧