Движение UI элемента за 3Д объектом
using UnityEngine;
public class im : MonoBehaviour
{
public Transform Cube;
public Camera MyCamera;
void Update()
{
transform.position = MyCamera.WorldToScreenPoint(Cube.position);
}
}
Плавное перемещение объекта из точки начальной локации в координаты указанного объекта. Скорость перемещения определяется переменной smoothing:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class swim : MonoBehaviour
{
public Transform point;
Vector3 destinationPoint;
public float smoothing = 1f;
void Update()
{
//Плавное "скольжение" из одной точки в другую
transform.position = Vector3.Lerp (transform.position, point.transform.position, smoothing * Time.deltaTime);
}
}
таскать 3Д объект указателем мыши или свайпом
using UnityEngine;
public class Drager : MonoBehaviour
{
Vector3 mOfset;
float ZCoord;
void OnMouseDown()
{
ZCoord = Camera.main.WorldToScreenPoint(gameObject.transform.position).z;
mOfset = gameObject.transform.position - GetMouseWorldPos();
}
private Vector3 GetMouseWorldPos()
{
Vector3 MousePoint = Input.mousePosition;
MousePoint.z = ZCoord;
return Camera.main.ScreenToWorldPoint(MousePoint);
}
void OnMouseDrag()
{
transform.position = new Vector3((GetMouseWorldPos() + mOfset).x, 50, (GetMouseWorldPos() + mOfset).z);
}
}
элегантный способ двигать объект)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
public class go : MonoBehaviour
{
void Update()
{
if (Input.GetKey(KeyCode.LeftArrow)) transform.Translate(-Time.deltaTime * 5, 0, 0);
if (Input.GetKey(KeyCode.RightArrow)) transform.Translate(Time.deltaTime * 5, 0, 0);
if (Input.GetKey(KeyCode.UpArrow)) transform.Translate( 0, 0, Time.deltaTime*5);
if (Input.GetKey(KeyCode.DownArrow)) transform.Translate(0, 0, -Time.deltaTime * 5);
}
}
перемещение объекта с помощью датчика акселерометра мобильного телефона:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class gyroscope : MonoBehaviour
{
float speed = 5.0f;
void Update()
{
Vector3 dir = Vector3.zero;
dir.x = Input.acceleration.x;
dir.z = Input.acceleration.y;
if (dir.sqrMagnitude > 1)
{
dir.Normalize();
}
dir *= Time.deltaTime;
transform.Translate(dir * speed);
}
}
Движение объекта за курсором указателя мыши:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class cursorfollow : MonoBehaviour
{
void Start()
{
Cursor.visible = false; //делаем указатель мыши невидимым
}
void Update()
{
Vector2 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition); //определяем координаты указателя мыши
transform.position = pos; //перемещаем объект в координаты указателя мыши
}
}
событие Touch (андройд)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class touchscreen : MonoBehaviour
{
void Update()
{
if(Input.touchCount > 0)
{
GetComponent<Rigidbody2D>().AddForce(transform.up * 2, ForceMode2D.Impulse);
}
}
}
швырнуть объект вперед на старте:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class polet : MonoBehaviour
{
Rigidbody rig;
void Start()
{
rig = GetComponent<Rigidbody>();
rig.AddForce(transform.forward * 1000);
}
}
Управление движением объекта в точку клика мышью или touch по экрану мобилки через компонент NavMesh (реакция на клик только при клике по коллайдеру):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class PlayerController : MonoBehaviour
{
private NavMeshAgent agent;
public Camera camera;
public GameObject LegoMan;
public Vector3 touchWayBegin; // вектор, начальной точки персонажа
Vector3 touchWayEnd; // вектор конечнгой точки персонажа
void Start()
{
agent = GetComponent<NavMeshAgent>();
touchWayEnd = transform.position;
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
RaycastHit hit;
if (Physics.Raycast(camera.ScreenPointToRay(Input.mousePosition), out hit))
{
agent.SetDestination(hit.point);
touchWayEnd = hit.point;
}
}
touchWayBegin = transform.position - touchWayEnd; //вектор пройденного расстояния
}
}
Свайп контроллер андройд:
В зависимости от направления свайпа переменные swipeLeft, swipeRight, swipeUp, swipeDown принимают значение «true», в скрипте управляемого объекта объявляется переменная public Swipe swipeControls, таким образом объекту можно сообщать о напралении свайпа и создавать реакции.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Swipe : MonoBehaviour
{
private bool tap, swipeLeft, swipeRight, swipeUp, swipeDown;
private Vector2 startTouch, swipeDelta;
public bool isDraging = false;
public Vector2 SwipeDelta { get { return swipeDelta; } }
public bool SwipeLeft { get { return swipeLeft; } }
public bool SwipeRight { get { return swipeRight; } }
public bool SwipeDown { get { return swipeDown; } }
public bool SwipeUp { get { return swipeUp; } }
void Update()
{
tap = swipeLeft = swipeRight = swipeUp = swipeDown = false;
#region Srandelon Inputs
if(Input.GetMouseButtonDown(0))
{
tap = true;
isDraging = true;
startTouch = Input.mousePosition;
}
else if (Input.GetMouseButtonUp(0))
{
isDraging = false;
Reset();
}
#endregion
#region MobileInputs
if(Input.touches.Length > 0)
if(Input.touches[0].phase == TouchPhase.Began)
{
isDraging = true;
tap = true;
startTouch = Input.touches[0].position;
}
else if (Input.touches[0].phase == TouchPhase.Ended|| Input.touches[0].phase == TouchPhase.Canceled)
{
isDraging = false;
Reset();
}
#endregion
swipeDelta = Vector2.zero;
if (isDraging)
{
if (Input.touches.Length > 0)
{
swipeDelta = Input.touches[0].position - startTouch;
}
else
if (Input.GetMouseButton(0))
{
swipeDelta = (Vector2)Input.mousePosition - startTouch;
}
if (swipeDelta.magnitude > 125)
{
float x = swipeDelta.x;
float y = swipeDelta.y;
if (Mathf.Abs(x) > Mathf.Abs(y))
{
//лево или право
if (x < 0)
{
swipeLeft = true;
}
else
{
swipeRight = true;
}
}
else
{
//вверх вниз
if (y < 0)
{
swipeDown = true;
}
else
{
swipeUp = true;
}
}
Reset();
}
}
}
private void Reset()
{
startTouch = swipeDelta = Vector2.zero;
isDraging = false;
}
}
реакции на свайп:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SwipeTest : MonoBehaviour
{
AudioSource audio;
public AudioClip touch;
public AudioClip swipe;
public Swipe swipeControls;
public Transform player;
private Vector3 desiredPosition;
public GameObject Cubik;
float targetAngleLeft = 92f; // Угол на который надо повернуться
float targetAngleRight = -92f; // Угол на который надо повернуться
float targetAngleUp = 92f; // Угол на который надо повернуться
float targetAngleDown = -92f; // Угол на который надо повернуться
float angleLeft;
float angleUp;
public bool left = false;
bool right = false;
bool Up = false;
bool Down = false;
public GameObject[] lego;
public int numberDetal = 1;
public int numberImage = 0;
public Image image;
public Sprite[] detal;
void Start()
{
audio = GetComponent<AudioSource>();
for(int i = 0; i<lego.Length; i++)
{
lego[i].SetActive(false);
}
}
public void legoplus()
{
if (numberDetal < lego.Length || numberDetal == lego.Length)
{
lego[numberDetal - 1].SetActive(true);
image.sprite = detal[numberImage + 1];
numberDetal++;
numberImage++;
audio.clip = touch;
audio.Play();
}
}
public void legominus()
{
if (numberDetal > 0 )
{
lego[numberDetal-2].SetActive(false);
image.sprite = detal[numberImage-1];
numberDetal--;
numberImage--;
audio.clip = touch;
audio.Play();
}
}
public void vihod()
{
audio.clip = touch;
audio.Play();
Application.Quit();
}
void Update()
{
if (swipeControls.SwipeLeft)
// desiredPosition += Vector3.left;
if(right==Down==Up ==false)
{
audio.clip = swipe;
audio.Play();
left = true;
}
if (swipeControls.SwipeRight)
// desiredPosition += Vector3.right;
if (left == Down == Up == false)
{
audio.clip = swipe;
audio.Play();
right = true;
}
if (swipeControls.SwipeUp)
if (left == right == Down == false)
{
audio.clip = swipe;
audio.Play();
Up = true;
}
// desiredPosition += Vector3.forward;
if (swipeControls.SwipeDown)
// desiredPosition += Vector3.back;
if (left == right == Up == false)
{
audio.clip = swipe;
audio.Play();
Down = true;
}
if (left)
{
angleLeft = Mathf.LerpAngle(angleLeft, targetAngleLeft, Time.deltaTime*20);
if (angleLeft > targetAngleLeft - 2)
{
left = false;
targetAngleLeft = targetAngleLeft + 90;
targetAngleRight = targetAngleRight +90;
}
}
if (right)
{
angleLeft = Mathf.LerpAngle(angleLeft, targetAngleRight, Time.deltaTime*20);
if (angleLeft < targetAngleRight + 2)
{
right = false;
targetAngleRight = targetAngleRight - 90;
targetAngleLeft = targetAngleLeft - 90;
}
}
if (Up)
{
angleUp = Mathf.LerpAngle(angleUp, targetAngleUp, Time.deltaTime*20);
if (angleUp > targetAngleUp - 2)
{
Up = false;
targetAngleUp = targetAngleUp + 90;
targetAngleDown = targetAngleDown + 90;
}
}
if (Down)
{
angleUp = Mathf.LerpAngle(angleUp, targetAngleDown, Time.deltaTime*20);
if (angleUp < targetAngleDown + 2)
{
Down = false;
targetAngleUp = targetAngleUp - 90;
targetAngleDown = targetAngleDown - 90;
}
}
//player.transform.position = Vector3.MoveTowards(player.transform.position, desiredPosition, 1f * Time.deltaTime);
Cubik.transform.rotation = Quaternion.Euler(angleUp, 0, angleLeft);
}
}