muy buenas chicos tengo un problema con este script y es que trabaja bien pero al iniciar se me pasa la camara a sobre la cabesa del player y no atras e notado que es el script de target pero no encuentro la solucion esta asi miren la camara using UnityEngine;
using System.Collections;using Globals;public class PlayerCamera : MonoBehaviour
{
#region Public Fields & Properties
public float yMinLimit = -85f;
public float yMaxLimit = 85f;
public float normalFOV = 60f;
public float zoomFOV = 30f;
public float lerpSpeed = 8.0f;
public float positionLerp = 6f;
public float normalHeight = 1.5f;
public float normalAimHeight = 1.8f;
public float minHeight =0.5f;
public float maxHeight =2f;
public float normalDistance = 2.5f;
public float normalAimDistance = 1f;
public float minDistance =0.2f;
public float maxDistance =2.5f;
public bool orbit;
public Transform target;
public Transform player;
public Vector2 speed = new Vector2 (135f, 135f);
public Vector2 aimSpeed = new Vector2 (100f, 100f);
public Vector2 maxSpeed = new Vector2 (100f, 100f);
public LayerMask hitLayer;
public Vector3 normalDirection = new Vector3(-1f, 0f, 0.3f);
public Vector3 aimDirection = new Vector3(-1f, 0f, 0.7f);
#endregion
#region Private Fields & Properties
private float _x = 0f;
private float _y = 0f;
private float _deltaTime;
private float _targetDistance;
private float _targetHeight;
private Transform _camTransform;
private Vector3 _position;
private Vector3 _camDir;
private Vector3 _camPos;
private Quaternion rotation;
private PlayerController playerController;
#endregion
#region Getters & Setters
public float Y {get { return _y; }}
public float X {get { return _x; }}
#endregion
#region System Methods
private void Start()
{
Cursor.visible = false;
Screen.lockCursor = true;
if (target == null || player == null) {
Destroy(this);
return;
}
target.parent = null;
_camTransform = transform;
Vector3 _angles = _camTransform.eulerAngles;
_x = _angles.y;
_y = _angles.x;
playerController = player.GetComponent<PlayerController>();
_targetDistance = normalDistance;
_camPos = player.position + new Vector3 (0, normalHeight, 0);
}
// Update is called once per frame
private void Update()
{
if (Input.GetButton (PlayerInput.Cancel))
{
Cursor.visible = !Cursor.visible;
Screen.lockCursor = !Screen.lockCursor;
}
if (Input.GetAxis (PlayerInput.Horizontal) != 0.0 || Input.GetAxis (PlayerInput.Vertical) != 0.0 || playerController.aim)
{
GoToOrbitMode (false);
}
if(!orbit && playerController.idleTimer > 0.1f)
{
GoToOrbitMode(true);
}
}
public void LateUpdate()
{
_deltaTime = Time.deltaTime;
GetInput();
RotatePlayer();
CameraMovement ();
}
#endregion
#region Custom Methods
public void GoToOrbitMode(bool state){
orbit = state;
playerController.idleTimer = 0.0f;
}
private void GetInput(){
Vector2 a = playerController.aim ? aimSpeed : speed;
_x += Mathf.Clamp (Input.GetAxis(PlayerInput.MouseX) * a.x ,-maxSpeed.x, maxSpeed.x) * _deltaTime;
_y -= Mathf.Clamp (Input.GetAxis(PlayerInput.MouseY) * a.y ,-maxSpeed.y, maxSpeed.y) * _deltaTime;
_y = ClampAngle (_y, yMinLimit, yMaxLimit);
}
public static float ClampAngle(float angle, float min, float max){
if(angle < -360) angle += 360;
if(angle > 360) angle -= 360;
return Mathf.Clamp (angle, min, max);
} private void RotatePlayer()
{
if (!orbit) playerController.targetYRotation = _x;
} public void CameraMovement()
{
if (playerController.aim)
{
GetComponent<Camera>().fieldOfView = Mathf.Lerp(GetComponent<Camera>().fieldOfView, zoomFOV, _deltaTime * lerpSpeed); _camDir = (aimDirection.x * target.forward) + (aimDirection.z * target.right);
_targetHeight = normalAimHeight;
_targetDistance = normalAimDistance;
}
else
{
GetComponent<Camera>().fieldOfView = Mathf.Lerp(GetComponent<Camera>().fieldOfView, normalFOV, _deltaTime * lerpSpeed); _camDir = (normalDirection.x * target.forward) + (normalDirection.z * target.right);
_targetHeight = normalHeight;
_targetDistance = normalDistance;
} _camDir = _camDir.normalized; _camPos = player.position + new Vector3 (0, _targetHeight, 0); RaycastHit hit;
if (Physics.Raycast (_camPos, _camDir, out hit, _targetDistance + 0.2f, hitLayer));
{
float t = hit.distance - 0.1f;
t -= minDistance;
t /= (_targetDistance - minDistance); _targetHeight = Mathf.Lerp(maxHeight, _targetHeight, Mathf.Clamp(t, 0.0f, 1.0f));
_camPos = player.position + new Vector3(0, _targetHeight, 0); _targetDistance = hit.distance - 0.1f;
} Vector3 lookPoint = _camPos;
lookPoint += (target.right * Vector3.Dot (_camDir * _targetDistance, target.right)); _camTransform.position = _camPos + (_camDir * _targetDistance);
_camTransform.LookAt (lookPoint); target.position = _camPos;
target.rotation = Quaternion.Euler (_y, _x, 0);
} #endregion
} El target esta de esta manera using UnityEngine;
using System.Collections;using Globals;public class PlayerTarget : MonoBehaviour
{ #region Public Fields & Properties
public Texture2D target;
public Texture2D targetOver; public bool overEnemy;
public bool aim; public LayerMask enemyLayer;
public LayerMask otherLayer; public float enemyDistance = 50.0f; public Camera playerCam; public Transform playerTarget; public PlayerController playerController;
public PlayerCamera playerCamera;
#endregion #region Private Fields & Properties
private bool _overEnemy;
private bool _aim; private GUITexture gui;
#endregion #region Getters & Setters #endregion #region System Methods
// Use this for initialization
private void Start()
{
playerTarget.parent = null; gui = GetComponent<GUITexture>(); gui.pixelInset = new Rect (-target.width * 0.5f, -target.height * 0.5f, target.width, target.height);
gui.texture = target; gui.color = new Color (0.5f, 0.5f, 0.5f, 0.15f);
} // Update is called once per frame
private void Update()
{
if (!playerCam.gameObject.activeSelf)
{
gui.color = new Color (0.5f, 0.5f, 0.5f, 0.0f);
return;
}
aim = Input.GetButton (PlayerInput.Fire2); Ray ray = playerCam.ScreenPointToRay (new Vector3 (Screen.width * 0.5f, Screen.height * 0.5f, 0f)); RaycastHit hit1;
RaycastHit hit2; overEnemy = Physics.Raycast (ray.origin, ray.direction, out hit1, enemyDistance, enemyLayer); if (overEnemy) {
if (Physics.Raycast (ray.origin, ray.direction, out hit2, enemyDistance, otherLayer))
{
overEnemy = hit1.distance < hit2.distance;
}
} float delta = 1.0f - ((playerCamera.Y + 85) * 0.0058823529f); if (playerController.aim)
{
playerTarget.position = playerCam.ScreenToWorldPoint (new Vector3 (Screen.width * 0.7f, Screen.height * (0.3f + (delta * 0.24f)), 10f));
}
else
{
playerTarget.position = playerCam.ScreenToWorldPoint (new Vector3 (Screen.width * 0.7f, Screen.height * (0.4f + (delta * 0.16f)), 10f));
}
if (overEnemy != _overEnemy)
{
_overEnemy = overEnemy; if (overEnemy)
{
gui.texture = targetOver;
}
else
{
gui.texture = target;
}
}
if (aim != _aim)
{
_aim = aim; if (aim)
{
gui.color = new Color(0.5f, 0.5f, 0.5f, 0.75f);
}
else
{
gui.color = new Color(0.5f, 0.5f, 0.5f, 0.15f);
}
}
#endregion #region Custom Methods #endregion
}
}
Llegue a esta duda por este tutorial https://www.youtube.com/playlist?list=PLQj3trwtbGHX9qfoeIjL5CXy1TF5u-Ig5 (//%5Byoutube%5Dhttps://www.youtube.com/playlist?list=PLQj3trwtbGHX9qfoeIjL5CXy1TF5u-Ig5%5B/youtube%5D)1 Error de syntax: if (Physics.Raycast (_camPos, _camDir, out hit, _targetDistance + 0.2f, hitLayer)); se produce por ; del final y por el cual hace que la cámara se posicione encima de la cabeza, quedaría así: if (Physics.Raycast (_camPos, _camDir, out hit, _targetDistance + 0.2f, hitLayer))Aparte que Screen.lockCursor = true; y Screen.lockCursor = !Screen.lockCursor; quedo obsoleto, cambialo por Cursor.lockState = CursorLockMode.Locked;