Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 10.10.2020
Сообщений: 7
1

Поворот обьекта при нажатии на клавишу

10.10.2020, 14:32. Показов 499. Ответов 10

Author24 — интернет-сервис помощи студентам
Добрый день,есть скрипт c #

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
 
[RequireComponent(typeof(Rigidbody2D))]
[RequireComponent(typeof(CapsuleCollider2D))]
 
public class CharacterController2D : MonoBehaviour
{
    // Move player in 2D space
    public float maxSpeed = 3.4f;
    public float jumpHeight = 6.5f;
    public float gravityScale = 1.5f;
    public Camera mainCamera;
    public float residueOil = 250f; //остаток бензина
    public Slider slider;
    
 
    
 
    bool facingRight = true;
    float moveDirection = 0;
    bool isGrounded = false;
    Vector3 cameraPos;
    Rigidbody2D r2d;
    Collider2D mainCollider;
    // Check every collider except Player and Ignore Raycast
    LayerMask layerMask = ~(1 << 2 | 1 << 8);
    Transform t;
 
    // Use this for initialization
    void Start()
    {
        t = transform;
        r2d = GetComponent<Rigidbody2D>();
        mainCollider = GetComponent<Collider2D>();
        r2d.freezeRotation = true;
        r2d.collisionDetectionMode = CollisionDetectionMode2D.Continuous;
        r2d.gravityScale = gravityScale;
        facingRight = t.localScale.x > 0;
        gameObject.layer = 8;
        
 
        if(mainCamera)
            cameraPos = mainCamera.transform.position;
            slider.value = 250;
 
    }
 
    // Update is called once per frame
    void Update()
    {
        moveDirection = 1;
        
      
        
        
        
 
        // Change facing direction
        if (moveDirection != 0)
        {
            if (moveDirection > 0 && !facingRight)
            {
                facingRight = true;
                t.localScale = new Vector3(Mathf.Abs(t.localScale.x), t.localScale.y, transform.localScale.z);
                
            }
            
        }
 
        // Jumping
        if (Input.GetKey("space") && residueOil > 0f) //проверяем и нажатие и остаток бензина
    {
        residueOil -= jumpHeight; // уменьшаем остаток бензина на величину подъема
        r2d.velocity = new Vector2(r2d.velocity.x, jumpHeight); //двигаемся вверх
        slider.value = residueOil;
        
    }
 
        // Camera follow
        if(mainCamera)
            mainCamera.transform.position = new Vector3(t.position.x, cameraPos.y, cameraPos.z);
    }
 
    void FixedUpdate()
    {
        Bounds colliderBounds = mainCollider.bounds;
        Vector3 groundCheckPos = colliderBounds.min + new Vector3(colliderBounds.size.x * 0.5f, 0.1f, 0);
        // Check if player is grounded
        isGrounded = Physics2D.OverlapCircle(groundCheckPos, 0.23f, layerMask);
 
        // Apply movement velocity
        r2d.velocity = new Vector2((moveDirection) * maxSpeed, r2d.velocity.y);
 
        // Simple debug
        Debug.DrawLine(groundCheckPos, groundCheckPos - new Vector3(0, 0.23f, 0), isGrounded ? Color.green : Color.red);
    }
}
При нажатии на пробел,самолетик поднимается,но мне нужно чтобы он еще (плавно) задирал нос вверх,а при отпускании пробела - вниз.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.10.2020, 14:32
Ответы с готовыми решениями:

Keylogger - увеличение счетчика при нажатии на одну клавишу и сброс при нажатии на другую
Можно ли в си создать Keylogger,если да то как?Мне нужно чтобы принажатии клавиши срабатывал...

Действие при нажатии на клавишу
Здравствуйте ! Необходимо при нажатии клавиши на клавиатуре, совершать действие ( прибавлять к...

Событие при нажатии на клавишу
Есть текстбокс для калькулятора, хочу, что бы можна было вводить только цифры и мои знаки, ну и...

Задержка при нажатии на клавишу
Возникла проблема. Если зажать клавишу(Допустим W) то сначала, как будто на жалось 1 раз, потом...

10
4 / 3 / 1
Регистрация: 30.01.2020
Сообщений: 51
10.10.2020, 14:39 2
Сделай через анимацию. Если нажал клавишу, то срабатывает анимация подъема носика самолета вверх, а если нет, то анимация опускания носика самолета вниз.
1
0 / 0 / 0
Регистрация: 10.10.2020
Сообщений: 7
10.10.2020, 14:50  [ТС] 3
Ок,допустим я сделал анимацию,что теперь нужно прописать в коде чтобы ее воспроизвести,и как эту анимку к коду привязать?
0
300 / 209 / 94
Регистрация: 04.07.2012
Сообщений: 895
10.10.2020, 14:55 4
fellowmean5, посмотрите любой видеоурок по аниматору. Что-нибудь на тему анимации движения персонажа подойдет.
1
0 / 0 / 0
Регистрация: 10.10.2020
Сообщений: 7
10.10.2020, 15:03  [ТС] 5
Спасибо
0
4 / 3 / 1
Регистрация: 06.10.2020
Сообщений: 28
10.10.2020, 15:51 6
Создай переменную
Animator anim;

Потом создай анимацию, присвой в аниматоре ей переменную.
А после задавай условия при котором будет производиться анимация
C#
1
2
3
if() {
anim.SetInteger("State", 1);
}
1
0 / 0 / 0
Регистрация: 10.10.2020
Сообщений: 7
10.10.2020, 17:45  [ТС] 7
Спасибо
0
2636 / 1564 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
10.10.2020, 20:47 8
fellowmean5, Поворот можно осуществить и более простым способом, если не хочется возиться с анимацией. Попробуйте поворачивать самолёт в зависимости от его скорости по Y.
Если взять за основу ваш скрипт в самом начале, то измените там пару строк.
В методе Update, замените вот этот участок
C#
1
2
3
4
5
6
7
8
// Jumping
if (Input.GetKey("space") && residueOil > 0f) //проверяем и нажатие и остаток бензина
{
    residueOil -= jumpHeight; // уменьшаем остаток бензина на величину подъема
    r2d.velocity = new Vector2(r2d.velocity.x, jumpHeight); //двигаемся вверх
    slider.value = residueOil;
 
}
на это:
C#
1
2
3
4
5
6
7
// Jumping
if (Input.GetKey(KeyCode.Space) && residueOil > 0f) 
{
    residueOil -= jumpHeight; 
    r2d.AddForce(Vector2.up * jumpHeight, ForceMode2D.Impulse);// лучше добавлять силу к объекту, чтобы подъём был более плавный
    slider.value = residueOil;
}

А в методе FixedUpdate уже поворачивайте самолёт.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void FixedUpdate()
{
    Bounds colliderBounds = mainCollider.bounds;
    Vector3 groundCheckPos = colliderBounds.min + new Vector3(colliderBounds.size.x * 0.5f, 0.1f, 0);
    isGrounded = Physics2D.OverlapCircle(groundCheckPos, 0.23f, layerMask);
 
    // ---------------------------------
    // ограничиваем скорость до 15, чтобы слишком быстро не падал и не поднимался. Значения подбираются индивидуально.
    float velocityY = Mathf.Clamp(r2d.velocity.y, -15f, 15f);
    r2d.velocity = new Vector2(moveDirection * maxSpeed, velocityY);
 
    // сам поворот в зависимости от вертикальной скорости
    r2d.rotation = r2d.velocity.y;
    // ---------------------------------
 
    Debug.DrawLine(groundCheckPos, groundCheckPos - new Vector3(0, 0.23f, 0), isGrounded ? Color.green : Color.red);
}
0
0 / 0 / 0
Регистрация: 10.10.2020
Сообщений: 7
12.10.2020, 18:58  [ТС] 9
Протестировал,есть пару проблем.1- поворачиватеся самолет вместе с камерой.2) при однократном нажатии он бесконечно поднимается в верх,нужно чтобы чуть чуть

Добавлено через 1 минуту
samana, Протестировал,есть пару проблем.1- поворачиватеся самолет вместе с камерой.2) при однократном нажатии он бесконечно поднимается в верх,нужно чтобы чуть чуть
0
2636 / 1564 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
12.10.2020, 19:35 10
Цитата Сообщение от fellowmean5 Посмотреть сообщение
samana, Протестировал,есть пару проблем.1- поворачиватеся самолет вместе с камерой
Не делайте камеру дочерним объектом самолёта. Чтобы она следила за самолётом, достаточно просто каждый кадр устанавливать ей нужные x и y самолёта. Либо воспользоваться компонентом Position Constraint, который "привязывает" один объект к другому(им) и автоматически передвигает его. https://docs.unity3d.com/Manua... raint.html

Цитата Сообщение от fellowmean5 Посмотреть сообщение
при однократном нажатии он бесконечно поднимается в верх,нужно чтобы чуть чуть
Тогда ловите именно нажатие кнопки, а не зажатие. Вместо Input.GetKey используйте Input.GetKeyDown
0
0 / 0 / 0
Регистрация: 10.10.2020
Сообщений: 7
12.10.2020, 19:50  [ТС] 11
samana, самолет не поворачивается тогда,и я не совсем понял как работает Position Constraint
0
12.10.2020, 19:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2020, 19:50
Помогаю со студенческими работами здесь

Ошибка при нажатии на клавишу
Всем привет, у меня возникла такая проблема с кодом. Вот код private void WaitKey() { ...

Обновление графика при нажатии на клавишу
Здравствуйте, проблема такова: отрисовка синусойды должна зависеть от 4 переменных a1, b1, c1, d1....

Запуск программы при нажатии на клавишу F2
Как реализовать запуск программы при нажатии на клавишу F2. Как я понимаю в реестре должно это...

Действия при нажатии на клавишу Enter
Ребят, хочу чтобы при нажатии клавиши Enter отправлялось сообщение в программе, а не по нажатию...

При нажатии на клавишу печатаются несколько
Позавчера я залил клаву чаем, решил промыть. Дал просохнуть ей 2 дня. Сейчас когда я подключал ту...

Переподключение к интернету при нажатии на клавишу
Допустим консольное приложение и при нажатие на клавишу интернет сам переподключается - ...


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

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