আমি কীভাবে ইউনিটি ইন্সপেক্টরটিতে একটি টগল বোতাম তৈরি করব?


13

আমি ইউনিটির টেরিন সরঞ্জামের অনুরূপ একটি সরঞ্জাম তৈরি করতে চাই, যার পরিদর্শকটিতে কিছু সুন্দর টগল বোতাম রয়েছে:

পরিদর্শকের মধ্যে টগল বোতাম টগলড বোতাম

আমি কীভাবে এর অনুরূপ নকশা অর্জন করতে পারি? আমি কীভাবে ইন্সপেক্টরটিতে সাধারণ বোতাম এবং অন্যান্য ইউআই উপাদান তৈরি করতে পারি তা জানি, তবে বোতামগুলি টগল করার জন্য আমি পর্যাপ্ত তথ্য খুঁজে পাচ্ছি না।

এখনও অবধি আমি সাধারণ টগল ব্যবহার করেছি যা একটি চেকবাক্স তৈরি করে:

var tmp = EditorGUILayout.Toggle( SetAmountFieldContent, _setValue );

if ( tmp != _setValue )
{
  _setValue = tmp;
  if ( _setValue )
    _smoothValue = false;
}

tmp = EditorGUILayout.Toggle( SmoothValueFieldContent, _smoothValue );

if ( tmp != _smoothValue )
{
  _smoothValue = tmp;
  if ( _smoothValue )
    _setValue = false;
}

টগলকে GUIStyle"বোতাম" এ সেট করা কাঙ্ক্ষিত ফলাফল দেয় না। পাঠ্য বা চিত্রের সামগ্রীটি ভিতরে না গিয়ে বোতামের বাম দিকে যায়।

var tmp = EditorGUILayout.Toggle( SetAmountFieldContent, _setValue, "Button" );

টগলে অনাকাঙ্ক্ষিত আচরণ

এছাড়াও জিইউআইএসকিনে পাওয়া বিকল্পগুলির মধ্যে কোনওটিই সহায়তা করে বলে মনে হচ্ছে না।

উত্তর:


8

আমি টগলগুলির পরিবর্তে বোতাম ব্যবহার করে এই সমস্যাটি সমাধান করেছি।

প্রথমে কোনও ফাংশনের আগে দুটি বোতাম শৈলীর সংজ্ঞা দিন:

private static GUIStyle ToggleButtonStyleNormal = null;
private static GUIStyle ToggleButtonStyleToggled = null;

তারপরে OnInspectorGui()নিশ্চিত হয়ে নিন যে এগুলি উত্পন্ন হয় যদি নাল:

if ( ToggleButtonStyleNormal == null )
{
  ToggleButtonStyleNormal = "Button";
  ToggleButtonStyleToggled = new GUIStyle(ToggleButtonStyleNormal);
  ToggleButtonStyleToggled.normal.background = ToggleButtonStyleToggled.active.background;
}

এবং তারপরে স্টাইলগুলি টগল করতে @jzx এর প্রস্তাবিত ধারণাটি ব্যবহার করুন:

GUILayout.BeginHorizontal(  );

if ( GUILayout.Button( SetAmountFieldContent, _setValue ? ToggleButtonStyleToggled : ToggleButtonStyleNormal ) )
{
  _setValue = true;
  _smoothValue = false;
}

if ( GUILayout.Button( SmoothValueFieldContent, _smoothValue ? ToggleButtonStyleToggled : ToggleButtonStyleNormal ) )
{
  _smoothValue = true;
  _setValue = false;
}

GUILayout.EndHorizontal();

এটি যা চেয়েছিল তা উত্পাদন করে:

প্রথম টগলড বোতাম দ্বিতীয় টগলড বোতাম


1
দারূন কাজ! আমি ইউনিটি 3 ডি এডিটর-তে টগল বোতামগুলির উত্তর খুঁজতে বেশ কয়েকদিন খুঁজছিলাম। কেবল একটি প্রশ্ন - আপনি _smoothValue = !GUILayout.Button( SetAmountFieldContent, _smoothValue ? ToggleButtonStyleToggled : ToggleButtonStyleNormal)দুটি বুলিয়ান থাকার পরিবর্তে কেবল কেন ব্যবহার করবেন না ? এটি আমার পক্ষে ভাল কাজ করে এবং কোডটি স্ট্যাডনার্ড unityক্য বাটন / টগলস ব্যবহারের কাছাকাছি দেখায়
Ivaylo Slavov

1
@IvayloSlavov আমি ব্যবহৃত স্বচ্ছতার জন্য একটি উদাহরণ হিসাবে
Lasse

4

টগল বোতামের বর্তমান অবস্থা ফিরিয়ে দেয় - হয় একই অবস্থায় মান হিসাবে পাস হয় বা ব্যবহারকারী দ্বারা পরিবর্তিত নতুন মান হয়। সুতরাং একটি ভাল প্যাটার্ন হবে ...

// TODO: Initialize these with GUIContent
private GUIContent _toggleButtonDepressedLabel;
private GUIContent _toggleButtonDefaultLabel;

// Current toggle state
bool _toggleButtonState;

void DisplayToggle()
{
    var image = _toggleButtonValue
                ? _toggleButtonDepressedLabel
                : _toggleButtonDefaultLabel;
    var newState = EditorGUILayout.Toggle(image, _toggleButtonState);
    if (newState != _toggleButtonState)
    {
        _toggleButtonState = newState;
        OnToggleButtonChanged();
    }
}

void OnGUI ()
{
    DisplayToggle();
}

void OnToggleButtonChanged()
{
    // Do stuff.
}

আপনি জিইউএসটিলেসের জন্য একই রাজ্য-নির্ভর স্বাপিং প্যাটার্নটি ব্যবহার করতে পারেন।

private GUIStyle _toggleButtonDepressedStyle;
private GUIStyle _toggleButtonDefaultStyle;
// ...
    var image = _toggleButtonValue
                ? _toggleButtonDepressedLabel
                : _toggleButtonDefaultLabel;
    var style = _toggleButtonValue
                ? _toggleButtonDepressedStyle
                : _toggleButtonDefaultStyle;
    var newState = EditorGUILayout.Toggle(image, _toggleButtonState, style);

3

এটি করার জন্য এখানে একটি প্রাথমিক, তবে সহজ উপায়:

 pressed = GUILayout.Toggle(pressed, "Toggle me !", "Button");

এখান থেকে নেওয়া


1
এটি করার জন্য এটি একটি দুর্দান্ত ডাঙ simple
এনএসএক্সডেভিড

2

GUILayout.Toolbar ব্যবহার করুন । দস্তাবেজগুলি বিভ্রান্ত করছে, এটি আসলে একসাথে বোতামগুলি চালায়:

সরঞ্জামদণ্ড উদাহরণ

অতিরিক্তভাবে, আপনি সরাসরি এই বোতাম শৈলী আঁকতে শৈলী "বাটনেফট", "বোতামমিড", "বোতাম রাইট" ব্যবহার করতে পারেন।

        var left = GUI.skin.FindStyle("buttonleft");
        GUILayout.Button("left only button", left);

0

তুমি এটি করতে পারো:

private GUIStyle buttonStyle;
private bool enableToogle;

public override void OnInspectorGUI()
{
    buttonStyle = new GUIStyle(GUI.skin.button);
    enableToogle = GUILayout.Toggle(enableToogle, "Toogle Me", buttonStyle);

    if(enableToogle)
    {
        // your stuff here
    }
}

এটি buttonStyleভিতরে গুরুত্বপূর্ণ যে আপনি OnInspectorGUI()অন্যথায় আপনি একটি ত্রুটি পাবেন তাত্ক্ষণিকভাবে গুরুত্বপূর্ণ । এছাড়াও, করবেন না buttonStyle = GUI.skin.button;কারণ আপনি skin.buttonরেফারেন্সটি অনুলিপি করছেন এবং কোনও পরিবর্তন buttonStyleহ'ল সমস্ত বোতামের শৈলী পরিবর্তন করা হবে।

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