using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine; public class Draws : MonoBehaviour { private LineRenderer lineRenderer; // private BoxCollider boxCollider; public Transform parent; public List localOffsets = new List(); private Vector3 initialScale; // ذخیره مقیاس اولیه public void Start() { lineRenderer = GetComponent(); // boxCollider = parent.gameObject.AddComponent(); // اضافه کردن BoxCollider initialScale = transform.lossyScale; // ذخیره مقیاس اولیه localOffsets = GetLinePositionsList(); // ذخیره موقعیت‌های اولیه نقاط UpdateCollider(); } public bool setIn; public void Update() { if (localOffsets.Count >= lineRenderer.positionCount) { if (!setIn) SetOwnerPositionInMiddle(); else { Vector3 currentScale = transform.lossyScale; Vector3 scaleRatio = new Vector3( currentScale.x / initialScale.x, currentScale.y / initialScale.y, currentScale.z / initialScale.z ); for (int i = 0; i < localOffsets.Count; i++) { // اعمال نسبت تغییر مقیاس بر روی نقاط Vector3 scaledOffset = Vector3.Scale(localOffsets[i], scaleRatio); Vector3 rotatedOffset = transform.rotation * scaledOffset; Vector3 newPosition = transform.position + rotatedOffset; lineRenderer.SetPosition(i, newPosition); } } // UpdateCollider(); // به‌روزرسانی برخورد بعد از تغییر موقعیت نقاط } else { localOffsets = GetLinePositionsList(); } } public List GetLinePositionsList() { List positions = new List(); int pointCount = lineRenderer.positionCount; for (int i = 0; i < pointCount; i++) { Vector3 pointPosition = lineRenderer.GetPosition(i); Vector3 localOffset = Quaternion.Inverse(transform.rotation) * (pointPosition - transform.position); positions.Add(localOffset); } return positions; } void SetOwnerPositionInMiddle() { setIn = true; List list = GetLinePositionsList(); if (list.Count > 0) { Vector3 sum = Vector3.zero; foreach (var offset in localOffsets) { sum += offset; } Vector3 middlePoint = sum / list.Count; transform.position = middlePoint; } parent.transform.position = transform.position; transform.parent = parent; localOffsets = GetLinePositionsList(); initialScale = transform.lossyScale; // ذخیره مجدد مقیاس اولیه پس از تنظیم مرکز UpdateCollider(); } public Bounds GetBoundingBox() { if (lineRenderer.positionCount == 0) return new Bounds(Vector3.zero, Vector3.zero); Vector3 min = lineRenderer.GetPosition(0); Vector3 max = min; for (int i = 1; i < lineRenderer.positionCount; i++) { Vector3 point = lineRenderer.GetPosition(i); min = Vector3.Min(min, point); max = Vector3.Max(max, point); } Vector3 size = max - min; Vector3 center = (max + min) / 2; return new Bounds(center, size); } public void UpdateCollider() { //if (boxCollider == null) // return; Bounds bounds = GetBoundingBox(); //boxCollider.center = transform.InverseTransformPoint(bounds.center); // تبدیل به مختصات محلی // boxCollider.size = bounds.size; parent.transform.localScale = bounds.size; if (!first&&setIn) { parent.transform.AddComponent(); first = true; } } bool first; }