আমি ইউনিটি 3 ডি তে কীভাবে একটি রূপরেখা আঁকতে পারি?


13

আমি নির্বিচারে উচ্চতার একটি আয়তক্ষেত্রটি হাইলাইট করার চেষ্টা করছি। আমি ভেবেছিলাম এটির সবচেয়ে সহজ উপায় হ'ল একটি পৃথক "বাক্স" গেমোবজেক্ট তৈরি করা যা আয়তক্ষেত্রটির বাহ্যরেখা দেয়।

আয়তক্ষেত্রের চারটি পয়েন্টের রূপরেখার জন্য আমি একটি মেশরেন্ডেরার + স্বচ্ছ টেক্সচার এবং লাইনরেেন্ডার উভয়ের সাথে চেষ্টা করেছি। উভয়ই খুব সন্তোষজনক হয় না।

এখানে চিত্র বর্ণনা লিখুন

(মাঝখানে রেখার উপস্থাপনকারী, ডানদিকে স্কেল করা কিউব)

এটি সম্পর্কে সঠিক উপায় কি? আমি বাম আয়তক্ষেত্রের মতো কিছু পাওয়ার চেষ্টা করছি - আমার পছন্দের চারটি পয়েন্টের মাধ্যমে স্থির প্রস্থের একটি সহজ পরিধি।

উত্তর:


8

ব্যবহার GUI.Box()

আপনার যদি কেবলমাত্র 2 ডি আয়তক্ষেত্রের প্রয়োজন হয় তবে জিইউআই হ'ল উপায়। টেক্সচার হিসাবে একটি সাধারণ আয়তক্ষেত্রটি ব্যবহার করে একটি নতুন GUIStyle তৈরি করুন (আয়তক্ষেত্রের অভ্যন্তরটি অবশ্যই স্বচ্ছ হওয়া উচিত), এর Borderমান সেট আপ করুন যাতে এটি প্রসারিত না হয়, এবং কল করে GUI.Box(new Rect(...),"",myGuiStyle);

আপনি Camera.WorldToScreenPointপদ্ধতিটি ব্যবহার করতে পারেন যদি আপনি বিশ্বের স্থানাঙ্কগুলিতে (অর্থাত 3 ডি) কোনও রূপরেখা তৈরি করতে চান তবে কেবল মনে রাখবেন যে ইউনিটির বিশ্ব সমন্বয়গুলিতে y নীচে থেকে উপরে যায় এবং জিইউআইতে y শীর্ষে থেকে নীচে যায়।

কোড উদাহরণ:

void OnGUI()
{
    //top left point of rectangle
    Vector3 boxPosHiLeftWorld = new Vector3(0.5f, 12, 0);
    //bottom right point of rectangle
    Vector3 boxPosLowRightWorld = new Vector3(1.5f, 0, 0);

    Vector3 boxPosHiLeftCamera = Camera.main.WorldToScreenPoint(boxPosHiLeftWorld);
    Vector3 boxPosLowRightCamera = Camera.main.WorldToScreenPoint(boxPosLowRightWorld);

    float width = boxPosHiLeftCamera.x - boxPosLowRightCamera.x;
    float height = boxPosHiLeftCamera.y - boxPosLowRightCamera.y;


     GUI.Box(new Rect(boxPosHiLeftCamera.x, Screen.Height - boxPosHiLeftCamera.y, width, height),"", highlightBox);
}

আমার ভুল না হলে GUI.Box () সবসময় দৃশ্যের কোনও অবজেক্টের শীর্ষে টানা থাকবে? গেমোবজেক্টের পিছনে বা আংশিকভাবে জিইউআই উপাদান থাকা কি সম্ভব?
রেভেন ড্রিমার

হ্যাঁ, জিইউআই সর্বদা অন্যান্য বিষয়গুলির পরে আঁকা। এমন একটি হ্যাক রয়েছে যা আপনি জিইউআইয়ের শীর্ষে একটি পৃথক ক্যামেরা রেন্ডার করতে ব্যবহার করতে পারেন, তবে এটি কিছুটা অকার্যকর।
কিছু মনে রাখবেন না

এই উত্তরটি আমার যা প্রয়োজন তা পেয়েছে তবে আমি এখনই উন্মুক্ত রেখেছি এই আশায় যে সাধারণ ক্ষেত্রে এটি করার আরও ভাল উপায় আছে।
রেভেন ড্রিমার

কোড সম্পাদনা যুক্ত করে আপনার সম্পাদনাটি আমি গ্রহণ করেছি এবং এতে GUI-y-upside-down বাগটি ঠিক করেছি।
কিছু মনে করবেন না

1

নীচে একটি অ শেডার পদ্ধতির রয়েছে approach

আপনার 2 ডি বাক্সটিকে চারটি রেখার চেয়ে বেশি কিছুই ভাবেন না, যেখানে প্রতিটি লাইন কেবল একটি মাত্রায় প্রসারিত হয় (অন্যান্য দুটি মাত্রা প্রান্তের ক্রস-বিভাগ)। এটি অনেকটা বাস্তবের মতো যদি আপনি এমন একটি বাক্স তৈরি করেন যা আপনি বাস্তব জীবনে একটি বাক্স তৈরি করেন, যেখানে আপনি কাঠের পরিবর্তনশীল দৈর্ঘ্যগুলি একসাথে পাইক করছেন যা সকলের একই ক্রস-সেকশন আকারের থাকে।

এটি মনে রেখে, আপনি একটি উপাদান তৈরি করতে পারেন, বলুন BoxBuilder, যা কোনও গেমওজেক্টের সাথে সংযুক্ত হয়ে চারটি শিশু গেমবজেক্ট তৈরি এবং পরিচালনা করে। প্রতিটি বাচ্চাদের গেমের অবজেক্ট আপনার বক্স প্রান্তগুলির মধ্যে একটি এবং এটি কেবল একটি 3 ডি ঘনক হতে পারে যা কেবল একটি মাত্রায় প্রসারিত। একটি widthএবং heightসংজ্ঞায়িত BoxBuilderস্তর সহ, আপনি চারটি শিশু প্রান্তের প্রয়োজনীয় অবস্থান এবং অ-ইউনিফর্ম স্কেল গণনা করতে পারেন। এটা অনেক হতে হবে pos.x=w/2, pos.y=h/2, ..., scale.x=h, scale.y=w, কোড সাজানোর ইত্যাদি।

যদিও আমি বিশ্বাস করি যে আপনি কেবল ২-ডি চাইছেন, তবে নোট করুন যে প্রয়োজনে 3 ডি বাক্সেও এই একই ধারণাটি প্রয়োগ করা যেতে পারে, যেখানে BoxBuilderএখন 12 টি শিশু প্রান্ত তৈরি করতে হবে এবং পরিচালনা করতে হবে, তবে কেবল প্রতিটি প্রান্তকে এক মাত্র মাত্রায় স্কেল করে।


কার্যক্ষম, তবে ওয়ে অত্যন্ত জটিল।
কিছু মনে করবেন না

যদি আমাকে এইভাবে করতে হয় তবে আমি কেবল 4 লাইন রেন্ডারার ব্যবহার করতাম ...
রাভেন ড্রিমার

এটি তবে সঠিকভাবে গভীরতার সাথে পরিচালনা করে।
ডাকমাস্ট্রো

1

একটি সহজ উপায় দুটি পাস সহ একটি শেডার ব্যবহার করা হয়: প্রথম পাসটি বস্তুকে কিছুটা স্কেল করতে ভার্টেক্স শ্যাডার ব্যবহার করে এবং পিক্সেল শেডারটি রঙের সাথে একটি রঙিন রঙের সাথে রঙিন করতে ব্যবহার করে যা আপনার রূপরেখাটি চান, এবং তারপরে দ্বিতীয় পাসটি নিয়মিত রেন্ডারিং করে।


আপনি কী বোঝাতে চেয়েছেন তা আরও ভাল করে বোঝানোর জন্য আপনি একটি কোড উদাহরণ দিতে পারেন?
রাভেন ড্রিমার 14

এটি কেবল উত্তল বস্তুর (আয়তক্ষেত্রের মতো) জন্য কাজ করবে যার মূলটি জ্যামিতিক কেন্দ্রে।
রুটলোকস

1

একটি 3 ডি কিউবের জন্য "স্ট্রোক" তৈরি করার দরকার ছাড়া আমি একটি রূপরেখা তৈরি করতে আমার একই সমস্যা ছিল এবং এটি করার একটি নতুন উপায় খুঁজে পেয়েছি যা আমি অনলাইনে অন্য কোথাও দেখিনি।

নীচের চিত্রটিতে রূপরেখা সহ দুটি আকার রয়েছে। ডানদিকে একটি লাইনরেেন্ডার দিয়ে নির্মিত একটি ঘনক্ষেত্র যা সমতল মুখগুলি তৈরি করে যা সর্বদা ব্যবহারকারীর দিকে ফিরছে। আমি এই পদ্ধতিটি সুপার গ্লাইচি পেয়েছি, এলোমেলো "স্ট্রোক" সহ প্রদর্শিত হয়েছে যা মুখটি তৈরি করে ত্রিভুজগুলি নকল করে।

বাম দিকের একটিটি হ'ল আমার "উদ্ভাবন" এর সাথে 12 টি পৃথক চর্মসার কিউবস যা একটি রূপরেখার মতো দেখাচ্ছে। রূপরেখায় "স্ট্রোক" এর আকার পরিবর্তন করতে আমার 12 টি চর্মাকার কিউবগুলির প্রত্যেকটির দুটি পক্ষের আকার বাড়াতে / হ্রাস করতে হবে। এটি 2 ডি রূপরেখার জন্যও কাজ করবে। রঙ এবং ভয়েলা পরিবর্তন করতে কেবল কোনও উপাদান প্রয়োগ করুন!

দুটি ভিন্ন রূপরেখা

এই চিত্রটিতে আপনি এই ঘনক্ষেত্রের কাঠামোর বিশদটি দেখতে পাবেন। এটি সমস্ত রানটাইমে তৈরি করা যেতে পারে তবে আমি এটি হাতে হাতে তৈরি করেছি এবং এটি প্রিফ্যাব হিসাবে ব্যবহার করেছি।

বিস্তারিত


0

আমি বর্তমানে একই সমস্যার মুখোমুখি হয়েছি এবং আমার সমাধানটি হ'ল ডকমেস্ট্রো এবং রাভেন ড্রিমার পরামর্শ দিয়েছিলেন - এমন একটি স্ক্রিপ্ট রয়েছে যা রানটাইমের সময় 4 টি শিশু অবজেক্ট তৈরি করে যার প্রত্যেকটিই সীমান্তের একটি অংশকে উপস্থাপন করে এবং প্রতিটিটির সাথে লাইন রেন্ডারগুলি সংযুক্ত করে।

আমার ক্ষেত্রে সীমানাকে আমার অবজেক্টের চারপাশে রাখার জন্য ক্রমাগত আকার পরিবর্তন করতে হবে (একটি পাঠ্য জাল [যা একটি জাল রেন্ডার ব্যবহার করে] কাস্টম পাঠ্য ক্ষেত্রের জন্য) তাই প্রতিটি আপডেট আমি এটি করেছিলাম:


float width = Mathf.Max(renderer.bounds.size.x + paddingX * 2, minWidth);      
float x = renderer.bounds.center.x - width / 2;
float height = renderer.bounds.size.y + paddingY * 2;
float y = renderer.bounds.center.y - height / 2;

AlterBorder(0, new Vector3(x - thickness / 2, y, 0), new Vector3(x + width + thickness / 2, y, 0)); //Bottom edge going left to right
AlterBorder(1, new Vector3(x + width, y + thickness / 2, 0), new Vector3(x + width, y + height - thickness / 2, 0)); //Right edge going bottom to top
AlterBorder(2, new Vector3(x + width + thickness / 2, y + height, 0), new Vector3(x - thickness / 2, y + height, 0)); //Top edge going right to left
AlterBorder(3, new Vector3(x, y + height - thickness / 2, 0), new Vector3(x, y + thickness / 2, 0)); //Left edge going top to bottom

AlterBorder() কেবলমাত্র উপযুক্ত লাইন রেন্ডারার অ্যাক্সেস করে (প্রথম প্যারামিটার দ্বারা নির্দিষ্ট করা) এবং এর শুরু এবং শেষটি যথাক্রমে প্রথম এবং দ্বিতীয় ভেক্টরটিতে সেট করে।

নোট করুন যে আমি rendererআকারের জন্য আমার রেফারেন্স হিসাবে ব্যবহার করেছি তবে স্পষ্টতই আপনি কোনও আয়তক্ষেত্র ব্যবহার করতে পারবেন, যতক্ষণ না x, y শীর্ষ বাম কোণে থাকে corner

আমি যা সত্যিই এটির কাজটি বলতে পারি তা থেকে খেলাতে দুর্দান্ত দেখাচ্ছে কারণ আমি আমার বর্ডারযুক্ত অবজেক্টটি সহজেই সমস্ত 3 অক্ষের মধ্যে ঘুরিয়ে দিতে পারি (এমনকি এটি ঘোরানও এবং যেহেতু লাইন রেন্ডাররা সর্বদা ক্যামেরার মুখোমুখি হয় তা অদ্ভুত লাগে না) এবং হয় কার্যকর করা কঠিন নয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.