Вторник, 18 Июня 2019, 21:38

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Модератор форума: beril  
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Туплю в написании скрипта
Туплю в написании скрипта
VasaGameDevДата: Суббота, 13 Сентября 2014, 13:38 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Делаю скрипт для перетаскивания объектов как в skyrim. Сделал, но когда я беру объект я могу его по всей карте перемещать. Теперь я туплю как переделать скрипт для нормального перемещения.

Код

using UnityEngine;
using System.Collections;
using System;
using System.Text.RegularExpressions;

//Скрипт вешаем на камеру

public class Drag : MonoBehaviour
{
  public int ID;
  public int layerObj;
  public bool memoryLayer;
  public float yObj;
  public string nameIgnore;
   
  public float hitPoint;
   
   
  RaycastHit hit;
  Ray ray;
   
  public GameObject obj;
   
  void Start()
  {
   memoryLayer = true;
  }
   
  void Update()
  {
   Motionobject();
  }
   
  //проверка перетаскиваемых объектов осуществляется по ID в имени объекта
  void Motionobject()
  {
   //проверяем нажатие кнопки мышки
   if (Input.GetMouseButtonDown(0))
   {
    //задаем направление луча
    ray = Camera.main.ScreenPointToRay(Input.mousePosition);
     
    //пускаем луч на 10 метров и если попали куда то, то
    if (Physics.Raycast(ray, out hit, 10))
    {
     //проверяем есть ли в имени десятичные цифры
     var reg = @"[0-9]+";
      
     //получаем имя того во что попал райкаст и убираем у него приставку ID
     nameIgnore = hit.collider.gameObject.name.Replace("ID", "");
      
     Debug.Log("Regex.IsMatch(nameIgnore, reg) = " + Regex.IsMatch(nameIgnore, reg));
      
     if (Regex.IsMatch(nameIgnore, reg))
     {
      //Debug.Log("hit.collider.name = " + nameIgnore);
       
      //и конвектируем в числовое значение
      ID = Convert.ToInt32(nameIgnore);
       
      if (ID != 1)
      {
       //запоминаем во что попали лучем, для дальнейшей работы с этим ГО
       obj = hit.collider.gameObject;
       Debug.Log("1");
      }
     }
    }
   }
    
   //тут мы и будем перемещать наш ГО
   if (obj != null)
   {
    Ray();
     
    //ставим флаг что уже запомнили слой
    if (memoryLayer)
    {
     //запоминаем слой ГО
     layerObj = obj.layer;
     memoryLayer = false;
    }
     
    //делаем ГО проницаемым для луча, что бы перемещать его в точку падения луча на терейне
    obj.layer = 2;
    //Debug.Log("hit.point = " + hit.point);
     
    //присваиваем их объекту на который попал луч
    //перемещаем соответственно только по горизонтальным плоскостям,
    //new Vector3(0, 0.5f, 0); приподнимаем ГО что бы он не сидел в текстурах
    //если подставить за место hit.distance например 10, то ГО будет двигаться на растоянии 10
    obj.transform.position = ray.GetPoint(hit.distance) + new Vector3(0, 0.5f, 0);
   }
    
   //если кнопка была отжата то перестаем работать с ГО и обнуляем переменную, возвращаем слой обратно какой был
   if (Input.GetMouseButtonUp(0))
   {
    if (obj != null)
    {
     obj.layer = layerObj;
     memoryLayer = true;
     obj = null;
    }
   }
  }
   
  void Ray()
  {
   ray = Camera.main.ScreenPointToRay(Input.mousePosition);
   Physics.Raycast(ray, out hit);
  }
}

allodsДата: Суббота, 13 Сентября 2014, 18:43 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
Цитата VasaGameDev ()
Сделал, но когда я беру объект я могу его по всей карте перемещать.

Объясни
VasaGameDevДата: Суббота, 13 Сентября 2014, 18:58 | Сообщение # 3
почетный гость
Сейчас нет на сайте
По идее я беру объект и могу его перетаскивать рядом с собой(расстояние объекта от персонажа должна быть не больше 1-2 метров), а у меня этот объект можно перетаскивать по всей карте (Расстояние от объекта до персонажа дальше чем 2 метра)
LertmindДата: Суббота, 13 Сентября 2014, 19:25 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
Может в этой строчке obj.transform.position = ray.GetPoint(hit.distance) + new Vector3(0, 0.5f, 0);
добавить Clamp? obj.transform.position = ray.GetPoint(Mathf.Clamp(hit.distance, 0f, 2f)) + new Vector3(0, 0.5f, 0);

Добавлено (13.09.2014, 19:25)
---------------------------------------------
Правда объект будет чуть выше, если дальше смотреть и расстояние чуть другое (потому что луч не параллелен поверхности). В играх от первого лица обычно объект просто перед тобой.

Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Туплю в написании скрипта
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2019 Рейтинг