Я пытаюсь создать игру, в которой вы сами будете ковать мечи, похожую на «Bladesong». Я уже сделал 3D-модель лезвия меча и шипы, которые вы сможете прикрепить к режущей кромке лезвия. Шипы должны привязываться к краю и перемещаться по краю с помощью перетаскивания. Я не могу понять, как привязать один объект к другому и заставить его перемещаться во время выполнения
Я пытался задать ChatGPT, но это не дало мне удовлетворительного результата, который даже сработал
РЕДАКТИРОВАТЬ: Вот код ChatGPT, который абсолютно не работал:
public class DragAndDropOnLine : MonoBehaviour
{
public GameObject startPoint;
public GameObject endPoint;
private bool isDragging = false;
private Vector3 offset;
private Camera mainCamera;
void Start()
{
mainCamera = Camera.main;
}
void Update()
{
if (isDragging)
{
DragObject();
}
if (Input.GetMouseButtonUp(0) && isDragging)
{
isDragging = false;
PlaceObject();
}
}
void OnMouseDown()
{
isDragging = true;
offset = transform.position - GetMouseWorldPosition();
}
void DragObject()
{
Vector3 mousePosition = GetMouseWorldPosition() +
offset;
Vector3 closestPoint =
GetClosestPointOnLine(startPoint.transform.position,
endPoint.transform.position, mousePosition);
transform.position = closestPoint;
}
Vector3 GetMouseWorldPosition()
{
Vector3 mousePos = Input.mousePosition;
mousePos.z = Mathf.Abs(mainCamera.transform.position.z);
return mainCamera.ScreenToWorldPoint(mousePos);
}
Vector3 GetClosestPointOnLine(Vector3 lineStart, Vector3
lineEnd, Vector3 point)
{
Vector3 lineDirection = (lineEnd -
lineStart).normalized;
float lineLength = Vector3.Distance(lineStart, lineEnd);
Vector3 projection = Vector3.Project(point - lineStart,
lineDirection);
float projectedLength =
Mathf.Clamp(projection.magnitude, 0,
lineLength);
return lineStart + lineDirection * projectedLength;
}
void PlaceObject()
{
Debug.Log("Object placed at position: " +
transform.position);
}
}
Вот код из руководства по перетаскиванию, которое я нашел на YouTube:
public class DragandDrop : MonoBehaviour
{
Vector3 mousePosition;
private Vector3 getMousePos()
{
return Camera.main.WorldToScreenPoint(transform.position);
}
private void OnMouseDown()
{
mousePosition = Input.mousePosition - getMousePos();
}
private void OnMouseDrag()
{
transform.position =
Camera.main.ScreenToWorldPoint(Input.mousePosition -
mousePosition);
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... e-in-unity
Привязка объектов друг к другу во время выполнения в Unity ⇐ C#
Место общения программистов C#
-
Anonymous
1727808525
Anonymous
Я пытаюсь создать игру, в которой вы сами будете ковать мечи, похожую на «Bladesong». Я уже сделал 3D-модель лезвия меча и шипы, которые вы сможете прикрепить к режущей кромке лезвия. Шипы должны привязываться к краю и перемещаться по краю с помощью перетаскивания. Я не могу понять, как привязать один объект к другому и заставить его перемещаться во время выполнения
Я пытался задать ChatGPT, но это не дало мне удовлетворительного результата, который даже сработал
РЕДАКТИРОВАТЬ: Вот код ChatGPT, который абсолютно не работал:
public class DragAndDropOnLine : MonoBehaviour
{
public GameObject startPoint;
public GameObject endPoint;
private bool isDragging = false;
private Vector3 offset;
private Camera mainCamera;
void Start()
{
mainCamera = Camera.main;
}
void Update()
{
if (isDragging)
{
DragObject();
}
if (Input.GetMouseButtonUp(0) && isDragging)
{
isDragging = false;
PlaceObject();
}
}
void OnMouseDown()
{
isDragging = true;
offset = transform.position - GetMouseWorldPosition();
}
void DragObject()
{
Vector3 mousePosition = GetMouseWorldPosition() +
offset;
Vector3 closestPoint =
GetClosestPointOnLine(startPoint.transform.position,
endPoint.transform.position, mousePosition);
transform.position = closestPoint;
}
Vector3 GetMouseWorldPosition()
{
Vector3 mousePos = Input.mousePosition;
mousePos.z = Mathf.Abs(mainCamera.transform.position.z);
return mainCamera.ScreenToWorldPoint(mousePos);
}
Vector3 GetClosestPointOnLine(Vector3 lineStart, Vector3
lineEnd, Vector3 point)
{
Vector3 lineDirection = (lineEnd -
lineStart).normalized;
float lineLength = Vector3.Distance(lineStart, lineEnd);
Vector3 projection = Vector3.Project(point - lineStart,
lineDirection);
float projectedLength =
Mathf.Clamp(projection.magnitude, 0,
lineLength);
return lineStart + lineDirection * projectedLength;
}
void PlaceObject()
{
Debug.Log("Object placed at position: " +
transform.position);
}
}
Вот код из руководства по перетаскиванию, которое я нашел на YouTube:
public class DragandDrop : MonoBehaviour
{
Vector3 mousePosition;
private Vector3 getMousePos()
{
return Camera.main.WorldToScreenPoint(transform.position);
}
private void OnMouseDown()
{
mousePosition = Input.mousePosition - getMousePos();
}
private void OnMouseDrag()
{
transform.position =
Camera.main.ScreenToWorldPoint(Input.mousePosition -
mousePosition);
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79040742/snapping-objects-to-each-other-while-in-runtime-in-unity[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия