Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
i'm no jedi
16 / 10 / 6
Регистрация: 24.02.2019
Сообщений: 161
1

Как допилить скрипт, чтобы персонаж поворачивался в направлении взгляда камеры?

13.05.2020, 23:20. Показов 2376. Ответов 0

Author24 — интернет-сервис помощи студентам
Взял прекрасный префаб FreeLookCameraRig из стандартных ассетов Unity, а так же нашёл в интернете скрипт, делающий повороты персонажа по направлению взгляда камеры, и нужно их как-то совместить, но я уже голову сломал, пытаясь понять, как это сделать.
Грубо говоря, цель - сделать так, чтобы, когда персонаж стоит на месте, камера могла свободно крутиться вокруг него (из префаба так и есть), но, когда персонаж начинает движение, его "вперёд" должно быть там, куда направлен "взгляд" камеры (это делает скрипт, который нужно встроить).
Я знаю, что в интернете достаточно гайдов по созданию такого управления, но мне нужно понять, как именно эти скрипты совместить. Был бы очень признателен, если бы мне помогли разобраться, как это сделать.
Скрипт, который нужно встроить:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using UnityEngine;
using System.Collections;
 
public class ThirdPersonCamera : MonoBehaviour {
 
    public bool lockCursor;
    public float mouseSensitivity = 10;
    public Transform target;
    public float dstFromTarget = 2;
    public Vector2 pitchMinMax = new Vector2 (-40, 85);
 
    public float rotationSmoothTime = .12f;
    Vector3 rotationSmoothVelocity;
    Vector3 currentRotation;
 
    float yaw;
    float pitch;
 
    void Start() {
        if (lockCursor) {
            Cursor.lockState = CursorLockMode.Locked;
            Cursor.visible = false;
        }
    }
 
    void LateUpdate () {
        yaw += Input.GetAxis ("Mouse X") * mouseSensitivity;
        pitch -= Input.GetAxis ("Mouse Y") * mouseSensitivity;
        pitch = Mathf.Clamp (pitch, pitchMinMax.x, pitchMinMax.y);
 
        currentRotation = Vector3.SmoothDamp (currentRotation, new Vector3 (pitch, yaw), ref rotationSmoothVelocity, rotationSmoothTime);
        transform.eulerAngles = currentRotation;
 
        transform.position = target.position - transform.forward * dstFromTarget;
 
    }
 
}
Скрипт, в который нужно встроить:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
using System;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;
 
namespace UnityStandardAssets.Cameras
{
    public class FreeLookCam : PivotBasedCameraRig
    {
        // This script is designed to be placed on the root object of a camera rig,
        // comprising 3 gameobjects, each parented to the next:
 
        //  Camera Rig
        //      Pivot
        //          Camera
 
        [SerializeField] private float m_MoveSpeed = 1f;                      // How fast the rig will move to keep up with the target's position.
        [Range(0f, 10f)] [SerializeField] private float m_TurnSpeed = 1.5f;   // How fast the rig will rotate from user input.
        [SerializeField] private float m_TurnSmoothing = 0.0f;                // How much smoothing to apply to the turn input, to reduce mouse-turn jerkiness
        [SerializeField] private float m_TiltMax = 75f;                       // The maximum value of the x axis rotation of the pivot.
        [SerializeField] private float m_TiltMin = 45f;                       // The minimum value of the x axis rotation of the pivot.
        [SerializeField] private bool m_LockCursor = false;                   // Whether the cursor should be hidden and locked.
        [SerializeField] private bool m_VerticalAutoReturn = false;           // set wether or not the vertical axis should auto return
 
        private float m_LookAngle;                    // The rig's y axis rotation.
        private float m_TiltAngle;                    // The pivot's x axis rotation.
        private const float k_LookDistance = 100f;    // How far in front of the pivot the character's look target is.
        private Vector3 m_PivotEulers;
        private Quaternion m_PivotTargetRot;
        private Quaternion m_TransformTargetRot;
       
 
        protected override void Awake()
        {
            base.Awake();
            // Lock or unlock the cursor.
            Cursor.lockState = m_LockCursor ? CursorLockMode.Locked : CursorLockMode.None;
            Cursor.visible = !m_LockCursor;
            m_PivotEulers = m_Pivot.rotation.eulerAngles;
 
            m_PivotTargetRot = m_Pivot.transform.localRotation;
            m_TransformTargetRot = transform.localRotation;
        }
 
 
        protected void Update()
        {
            HandleRotationMovement();
            if (m_LockCursor && Input.GetMouseButtonUp(0))
            {
                Cursor.lockState = m_LockCursor ? CursorLockMode.Locked : CursorLockMode.None;
                Cursor.visible = !m_LockCursor;
            }
            
        }
 
 
        private void OnDisable()
        {
            Cursor.lockState = CursorLockMode.None;
            Cursor.visible = true;
        }
 
 
        protected override void FollowTarget(float deltaTime)
        {
            if (m_Target == null) return;
            // Move the rig towards target position.
            transform.position = Vector3.Lerp(transform.position, m_Target.position, deltaTime*m_MoveSpeed);
        }
 
 
        private void HandleRotationMovement()
        {
            if(Time.timeScale < float.Epsilon)
            return;
 
            // Read the user input
            var x = CrossPlatformInputManager.GetAxis("Mouse X");
            var y = CrossPlatformInputManager.GetAxis("Mouse Y");
 
            // Adjust the look angle by an amount proportional to the turn speed and horizontal input.
            m_LookAngle += x*m_TurnSpeed;
 
            // Rotate the rig (the root object) around Y axis only:
            m_TransformTargetRot = Quaternion.Euler(0f, m_LookAngle, 0f);
 
            if (m_VerticalAutoReturn)
            {
                // For tilt input, we need to behave differently depending on whether we're using mouse or touch input:
                // on mobile, vertical input is directly mapped to tilt value, so it springs back automatically when the look input is released
                // we have to test whether above or below zero because we want to auto-return to zero even if min and max are not symmetrical.
                m_TiltAngle = y > 0 ? Mathf.Lerp(0, -m_TiltMin, y) : Mathf.Lerp(0, m_TiltMax, -y);
            }
            else
            {
                // on platforms with a mouse, we adjust the current angle based on Y mouse input and turn speed
                m_TiltAngle -= y*m_TurnSpeed;
                // and make sure the new value is within the tilt range
                m_TiltAngle = Mathf.Clamp(m_TiltAngle, -m_TiltMin, m_TiltMax);
            }
 
            // Tilt input around X is applied to the pivot (the child of this object)
            m_PivotTargetRot = Quaternion.Euler(m_TiltAngle, m_PivotEulers.y , m_PivotEulers.z);
 
            if (m_TurnSmoothing > 0)
            {
                m_Pivot.localRotation = Quaternion.Slerp(m_Pivot.localRotation, m_PivotTargetRot, m_TurnSmoothing * Time.deltaTime);
                transform.localRotation = Quaternion.Slerp(transform.localRotation, m_TransformTargetRot, m_TurnSmoothing * Time.deltaTime);
            }
            else
            {
                m_Pivot.localRotation = m_PivotTargetRot;
                transform.localRotation = m_TransformTargetRot;
            }
        }
    }
}

Само собой, я не прошу сделать всё за меня, но объясните, если не сложно, что куда вставить и с какими изменениями. Я слишком начинающий, чтобы понять, что происходит в этих скриптах.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2020, 23:20
Ответы с готовыми решениями:

Как сделать так, чтобы спрайт поворачивался за курсором?
Как сделать чтобы player поворачивался за курсором? Помогите реализовать пожалуйста) using...

Как переделать данный код, чтобы при вращении мышью объект ни вращался а поворачивался?
Как мне сделать с помощью DirectInput так чтобы при вращении мышью объект ни вращался а...

Как сделать, чтобы персонаж не летал?
Здравствуйте ,я создаю игру как сделать так что бы персонаж не летал?

Как сделать, чтобы персонаж не наклонялся головой
Здравствуйте. Имеется 3d персонаж, когда он ходит, то случается так, он наклоняется головой до...

0
13.05.2020, 23:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2020, 23:20
Помогаю со студенческими работами здесь

Как сделать чтобы персонаж не проходил сквозь объект?
Есть персонаж и tilemap на обоях есть колайдеры, также rigidbody2d на персонаже Body Type...

Сделать переход камеры когда персонаж уходит за поля экрана
Привет всех с наступающим Новым Годом)) Есть идея сделать 2D игру в стиле 3D и надо сделать...

Как сделать так чтобы персонаж в игре двигался сам
На данный момент я учусь писать игры на C++. Я сделал так чтобы персонаж двигался клавишами, а как...

Как сделать, чтобы персонаж прыгал всего один раз, а не бесконечно?
как сделать что более 1 раза не прыгал ВОТ САМ КОД: using System.Collections; using...

Хочу чтобы танк поворачивался при нажатии на кнопку А на определенный градус (влево и направо)
ребят нужна помощь. Делаю проект танки. Возникла такая проблема . хочу что бы танк поворачивался...

Графика: Как сделать так, чтобы персонаж не мог проходить, пересекать стены?
Приветствую. Нарисовал лабиринт и персонажа (красный круг), который должен дойти до выхода от...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru