Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

duda sobre camara en tercera persona

Iniciado por rolin, Septiembre 07, 2015, 05:42:33 AM

Tema anterior - Siguiente tema
Septiembre 07, 2015, 05:42:33 AM Ultima modificación: Enero 01, 1970, 01:00:00 AM por rolin
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
}
}

Febrero 02, 2016, 06:15:12 AM #1 Ultima modificación: Enero 01, 1970, 01:00:00 AM por JoellDJ
Llegue a esta duda por este tutorial https://www.youtube.com/playlist?list=PLQj3trwtbGHX9qfoeIjL5CXy1TF5u-Ig51 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;

Etiquetas: