Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Скрипты по юнити 5

Скрипты по юнити 5

Поделиться
GameProgramsПользовательwww23 сен. 201710:01#0
Подскажите как можно сделать поворот объекта на 90 градусов по клику. То есть кликнул по нему он повернулся, кликнул еще он опять повернулся и чтобы поворот был виден а не резко на 90 градусов, анимация не подходит
SalamandrПостоялецwww23 сен. 201712:13#1
transform.rotate https://docs.unity3d.com/ScriptReference/Transform.Rotate.html

Правка: 23 сен. 2017 12:16

HolyDelПостоялецwww23 сен. 201712:16#2
начать можешь с такого скрипта:
public class Turn90Deg : MonoBehaviour {

    public float turn_scale = 0.1f;
    Quaternion next_turn = Quaternion.identity;
  void Start () {
    
  }

    private void OnMouseDown()
    {
        Vector3 angles = transform.rotation.ToEulerAngles();
        next_turn = Quaternion.identity;
        next_turn.SetEulerRotation(angles.x, angles.y, angles.z + 3.14f / 2.0f);
    }

    void Update () {
        transform.rotation = Quaternion.Slerp(transform.rotation, next_turn, turn_scale);
    }
}
VolgПостоялецwww23 сен. 201713:03#3
[RequireComponent(typeof(Spinner))]
public class RotateOnClick : MonoBehaviour
{
    [SerializeField]
    private Vector3 eulerAngles = new Vector3(0, 90, 0);
    [SerializeField]
    private float time = 1f;

    private Spinner spinner;

    private void Start()
    {
        spinner = GetComponent<Spinner>();
    }

    private void OnMouseDown()
    {
        if (!spinner.SpinningNow)
        {
            spinner.Rotate(transform, eulerAngles, time);
        }
    }
}
public class Spinner : MonoBehaviour
{
    private Coroutine rotation;
    private float lerpTime;

    public bool SpinningNow { get; private set; }

    public bool Rotate(Transform transform, Vector3 eulerAngles, float rotationTime)
    {
        if (SpinningNow)
            return false;

        lerpTime = rotationTime;
        rotation = StartCoroutine(LerpRotation(transform, transform.rotation.eulerAngles, transform.rotation.eulerAngles + eulerAngles));
        return true;
    }

    public void Stop()
    {
        if (rotation != null)
        {
            StopCoroutine(rotation);
        }
    }

    private IEnumerator LerpRotation(Transform transform, Vector3 fromEulerAngles, Vector3 toEulerAngles)
    {
        float t, time;
        t = time = 0f;
        Vector3 eulerAngles;

        SpinningNow = true;
        while (t < 1)
        {
            time += Time.deltaTime;
            if (time > lerpTime)
            {
                time = lerpTime;
            }
            t = time / lerpTime;
            eulerAngles = Vector3.Lerp(fromEulerAngles, toEulerAngles, t);
            transform.rotation = Quaternion.Euler(eulerAngles);
            yield return new WaitForEndOfFrame();
        }
        SpinningNow = false;
    }
}
GameProgramsПользовательwww23 сен. 201719:57#4
Вот спасибо, помогли, а то спрашивал на другом форуме дак мне в ответ был задан другой вопрос. Щас покажу

Поясните, пожалуйста, что значит, анимация не подходит? Не резкий, а плавный поворот - это и есть анимация. Анимация - это когда каждый кадр угол объекта (и/или его положение, и/или его масштаб) меняются. Или вы что-то другое имеете ввиду?

Буду пробовать скрипты.

Правка: 23 сен. 2017 19:58

GameProgramsПользовательwww23 сен. 201720:11#5
Проверил оба скрипта, оба хороши, но у первого (от HolyDel) есть баг, если нажать на объект более 1 раза то объект повернется не на 90 градусов.

И прошу прощения сразу за свою наглость не могли бы мне помочь с еще одним скриптом, хочу сделать управление персонажем как в старых 2d играх с видом с верху. Ну то есть чтобы персонаж передвигался как бы по невидимой сетке.

когда держиш клавишу например W то перс движется в этом направлении, а кнопки A S D не реагируют. При отпускании перс останавливается и все кнопки становятся активны, а когда нажмешь кнопку, а не удерживаешь то чтобы перс как бы прошел расстояние от одной клетки до другой, ну то есть определенное расстояние а не сразу встал.

Схожее управление делалось в играх типа "Сокобан"

Просто целых 3 игры есть в разработке, но я их не начинал даже из-за того что не могу найти скрипт такого управления

Правка: 23 сен. 2017 20:38

endeavour_prПостоялецwww23 сен. 201722:14#6
Salamandr
> transform.rotate
Если GаmeObject имеет твердое тело, его нужно вращать через физику.

Правка: 23 сен. 2017 22:14

GameProgramsПользовательwww3 окт. 201712:55#7
Что никто не знает как такое управление сделать?
sinobyПостоялецwww3 окт. 201713:26#8
все знают, только не охота, иди читай туториалы по юне, даже подскажу где https://unity3d.com/learn/tutorials
GameProgramsПользовательwww3 ноя. 201710:44#9
нашел скрипт в сети, он работает, все ок, но я заметил в нем одну функцию в воид старт, которая по моему мнения там совершенно не нужна, поясните может я ошибаюсь.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MouseLook : MonoBehaviour {
public enum RotationAxex {
MouseXAndY = 0,
MouseX = 1,
MouseY = 2
}
public RotationAxex axex = RotationAxex.MouseXAndY;

public float sensitivityHor = 9.0f;
public float sensitivityVert = 9.0f;

public float minimumVert = -45.0f;
public float maximumVert = 45.0f;

private float _rotationX = 0;

void Start () {
Rigidbody body = GetComponent<Rigidbody> ();
if (body != null)
body.freezeRotation = true;
}

void Update () {
if (axex == RotationAxex.MouseX) {
transform.Rotate (0, Input.GetAxis("Mouse X") * sensitivityHor, 0);
// это поворот в горизонтальной плоскости
}
else if (axex == RotationAxex.MouseY) { 
_rotationX -= Input.GetAxis ("Mouse Y") * sensitivityVert;
_rotationX = Mathf.Clamp (_rotationX, minimumVert, maximumVert);

float rotationY = transform.localEulerAngles.y;

transform.localEulerAngles = new Vector3 (_rotationX, rotationY, 0);
//это поворот в вертикальной плоскости

}
else {
_rotationX -= Input.GetAxis ("Mouse Y") * sensitivityVert;
_rotationX = Mathf.Clamp (_rotationX, minimumVert, maximumVert);

float delta = Input.GetAxis ("Mouse X") * sensitivityHor;
float rotationY = transform.localEulerAngles.y + delta;

transform.localEulerAngles = new Vector3 (_rotationX, rotationY, 0);
//это комбинированный поворот
}
}
}
greencrazycatПостоялецwww3 ноя. 201712:25#10
GamePrograms
> которая по моему мнения там совершенно не нужна
если на объекте нет Rigidbody - то не нужна (код в Start отключает влияние Rigidbody на поворот если найден компонент Rigidbody )
GameProgramsПользовательwww11 ноя. 201717:48#11
Реджитбади на камере нет изначально, потому и спрашиваю, зачем она нужна, так как она бесполезна
harbingerПользовательwww12 ноя. 201712:24#12
GamePrograms
> То есть кликнул по нему он повернулся, кликнул еще он опять повернулся и чтобы
> поворот был виден а не резко на 90 градусов, анимация не подходит
>

Вообще то что ты нашел последний скрипт, это поворот не по клику, а поворот по отслеживанию положения курсора мышки.
P.S. если тебе то этот скрипт подошел, то видимо ты сам не понимаешь что тебе нужно.

Правка: 12 ноя. 2017 12:27

HTCraftПостоялецwww13 ноя. 20179:46#13
GamePrograms
Реджитбади на камере нет изначально, потому и спрашиваю, зачем она нужна, так как она бесполезна

Просмотрите урок про UFO 2D, там объясняется для чего нужен объект Rigidbody.
Правда там для Rigidbody2D, но принцип, думаю, одинаков.

/ Форум / Программирование игр / Игровая логика и ИИ

2001—2017 © GameDev.ru — Разработка игр