
सभी को शुभ दिन।
आइए यूनिटी 3 डी के साथ शुरू करें। संक्षेप में, यह एक तीन-आयामी गेम इंजन है। एक मुफ्त संस्करण आधिकारिक वेबसाइट पर उपलब्ध है, एक प्रो संस्करण और मोबाइल प्लेटफार्मों पर एप्लिकेशन अपलोड करने की क्षमता वाला एक संस्करण पहले से ही पैसे के लायक है।
इस इंजन में समृद्ध क्षमताएं हैं, लेकिन सामान्य तौर पर यह नहीं पता कि कैसे और कुछ चीजों को अभी भी मूल रूप से करना है। उदाहरण के लिए, आपके पास एक वेब पेज प्रदर्शित करने का कार्य था (उदाहरण के लिए, खेल के मुख्य मेनू से लिंक पर क्लिक करने पर आपका व्यक्तिगत पृष्ठ)। WWW वर्ग को एकता में नेटवर्क के साथ काम करने के लिए डिज़ाइन किया गया है, लेकिन इसमें केवल वेब पृष्ठों के साथ डेटा का आदान-प्रदान करने की क्षमता है, यह प्रतिपादन कार्य को संभाल नहीं सकता है। आप सभी विकल्पों के माध्यम से जाते हैं, और यह निर्णय लेते हैं कि वेब पेज को मूल iOS WebView का उपयोग करके प्रदर्शित करना बेहतर है (मैं तुरंत कहता हूं कि यह लेख उद्देश्य-सी पर वेब दृश्य लिखने के बारे में नहीं है, बल्कि यूनिटी के साथ मित्र कैसे बनाएं)। पहले आपको xCode (या AppCode) खोलने और एक खाली एप्लिकेशन बनाने की आवश्यकता है (यहां यह ध्यान दिया जाना चाहिए कि एकता द्वारा बनाई गई परियोजना ARC का समर्थन नहीं करती है, इसलिए आपको अपने हैंडल से मेमोरी को साफ़ करना होगा)। हमें दो उद्देश्य-सी कक्षाओं की आवश्यकता होगी। हम उन्हें WebController और WebViewCaller नाम देंगे। तदनुसार, चार फाइलें WebController.h, WebController.m, WebViewCaller.h और WebViewCaller.m बनाई जाएंगी। एक्सटेंशन .h वाली फाइलें हेडर फाइलें होती हैं, सभी वर्ग विधियों को वहां वर्णित किया जाना चाहिए। एम फाइलें उनके प्रत्यक्ष कार्यान्वयन हैं। शुरू करने के लिए, हम तय करते हैं कि हम अपने वेब दृश्य से क्या चाहते हैं। हम चाहते हैं कि वर्ग दो NSString मापदंडों को स्वीकार करे, पहला वह पृष्ठ है जिसे हमें नेटवर्क पर एक कनेक्शन होने पर जाना चाहिए, और दूसरा HTML सिस्टम में फ़ाइल सिस्टम में पथ है जिसे हम इंटरनेट कनेक्शन नहीं होने पर डिफ़ॉल्ट रूप से लोड करना चाहते हैं। WebController के लिए, मैं केवल एक .h फ़ाइल प्रदान करूंगा, हम अधिक विस्तार से WebViewCaller पर ध्यान केन्द्रित करेंगे।
इसलिए, हबर, गूगल और स्टैकओवरफ़्लो की मदद से, हमने एक वर्ग लिखा जो एक वेब दृश्य बनाता है। .H फ़ाइल कुछ इस प्रकार है:
@interface WebController : UIViewController <UIWebViewDelegate> - (id)initWithOnlineHtml:(NSString*) _onlineHtml withOfflineHtml:(NSString*) _offlineHtml; @end
यह वास्तव में initWithOnlineHtml: withOfflineHtml: और दो स्ट्रिंग पैरामीटर _onlineHtml और _offlineHtml नाम के साथ सार्वजनिक निर्माणकर्ता के हस्ताक्षर हैं, जिसके उद्देश्य से मुझे लगता है कि सभी को स्पष्ट होना चाहिए।
अगला, हमें इस दृश्य को अपने एप्लिकेशन में जोड़ना होगा। हम इसे अपने WebVievCaller वर्ग में करेंगे। उसे हमारे वेबव्यू को आकर्षित करना चाहिए, और एक बैक बटन खींचना चाहिए, जो हमें हमारे खेल में वापस लाएगा। शुरू करने के लिए, हमारी कक्षा इस तरह दिखाई देगी (.h फ़ाइल)
#import <Foundation/Foundation.h> #import "TEWebController.h" @interface WebViewCaller : NSObject -(IBAction)quitBack:(id)sender; -(void) callViewWithOnlineHtml:(NSString*) _onlineHtml withOfflineHtml:(NSString*) _offlineHtml; @end
SkipBack एक फ़ंक्शन है जिसे एक बटन दबाकर कॉल किया जाएगा, CallViewWithOnlineHtml: withOfflineHtml: वास्तव में हमारे WebView को वर्तमान विंडो में जोड़ देगा और एक बटन आकर्षित करेगा। तो हमारा वर्ग ऐसा दिखता है:
@implementation WebViewCaller UIWindow* window; -(IBAction)quitBack:(id)sender { NSLog(@"%d",clicked.tag); } -(void) callViewWithOnlineHtml:(NSString*) _onlineHtml withOfflineHtml:(NSString*) _offlineHtml { TEWebController* webController = [[TEWebController alloc] initWithOnlineHtml:_onlineHtml withOfflineHtml:_offlineHtml]; window = [[UIApplication sharedApplication] keyWindow];
यहां आप थोड़ा और ठहर सकते हैं। हम एकता से आए मापदंडों के साथ अपना वेब दृश्य बनाते हैं, पंक्ति 1 हमें वर्तमान विंडो मिलती है, पंक्ति 2 हम अपने वेब दृश्य को डिस्प्ले कंट्रोलर के रूप में सेट करते हैं, लाइन 3 से पंक्ति 4 तक हम एक बटन बनाते हैं जो कंसोल में अपना टैग प्रदर्शित करता है और अंत में पंक्ति 4 हम स्क्रीन पर अपना बटन जोड़ते हैं।
फिर शुरू होता है कि यह लेख किस उद्देश्य के लिए था। हमें इस सभी खुशी को एकता में जोड़ने और बटन को वापस करने की आवश्यकता है।
सबसे पहले, हमें अपनी कक्षाओं को फ़ोल्डर में जोड़ना होगा "/ pathToYourProject / Assets / Plugins / iOS /" (आगे अटैचमेंट की अनुमति नहीं है)। हमने ऐसा क्यों किया, आप पूछ सकते हैं। निर्माण करते समय, एकता एक xCode प्रोजेक्ट बनाता है, और xCode इस फ़ोल्डर में फ़ाइलों को चुनता है और इसे अपने प्रोजेक्ट में जोड़ता है। एक XCode प्रोजेक्ट में, वे लाइब्रेरी फ़ोल्डर में हैं। प्लगइन कनेक्ट करने के लिए, फ़ंक्शन को "C" सिंटैक्स में घोषित किया जाना चाहिए। यही है, हमें अपने कार्य को फॉर्म में घोषित करना चाहिए
void _CalliOSWebView(const char *onlineHtml, const char *offlineHtml);
(const string * in "C" "C #" में स्ट्रिंग प्रकार से मेल खाती है, इसलिए हमें अभी भी अपने const चार * वैरिएबल को NSString में डालना होगा और callViewWithOnlineHtml: withOfflineHtml को इन मापदंडों के साथ कॉल करना होगा।) इसके लिए, क्लास के बाहर हम फंक्शन लिखते हैं। "C" शैली इनपुट मापदंडों को NSString और कॉलिंग में परिवर्तित करती है CallWithOnlineHtml: withOfflineHtml:।
यदि आप उद्देश्य-सी विधि को जोड़ने का प्रयास करते हैं, तो आपको फॉर्म की एक त्रुटि मिलेगी:
Undefined symbols for architecture armv7: "__CalliOSWebView", referenced from: RegisterMonoModules() in RegisterMonoModules.o ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)
हम अपनी कक्षा में आवश्यक बदलाव करेंगे। अब हमारी .m फाइल को इस तरह दिखना चाहिए:
@implementation WebViewCaller UIWindow* window; -(IBAction)quitBack:(id)sender { NSLog(@"%d",clicked.tag); } -(void) callViewWithOnlineHtml:(NSString*) _onlineHtml withOfflineHtml:(NSString*) _offlineHtml { TEWebController* webController = [[TEWebController alloc] initWithOnlineHtml:_onlineHtml withOfflineHtml:_offlineHtml]; window = [[UIApplication sharedApplication] keyWindow];
हमें .h फ़ाइल में अपने फ़ंक्शन का विवरण भी जोड़ना होगा
#import <Foundation/Foundation.h> #import "WebController.h" @interface WebViewCaller : NSObject -(IBAction)quitBack:(id)sender; -(void) callViewWithOnlineHtml:(NSString*) _onlineHtml withOfflineHtml:(NSString*) _offlineHtml; @end #ifdef __cplusplus extern "C" { #endif void _CalliOSWebView(const char *onlineHtml, const char *offlineHtml); #ifdef __cplusplus } #endif
अब हम अपने प्लगइन का उपयोग कर सकते हैं। इसके लिए, यूनिटी [DllImport ("PluginName")] का उपयोग करता है, लेकिन चूंकि हम iOS के साथ काम करते हैं, जहां प्लग इन को असेंबली में शामिल किया जाता है, हम [DllImport ("__Internal") का उपयोग करेंगे।
एकता में कोड इस तरह दिखेगा:
public static void CallForWebPage() { if (Application.platform == RuntimePlatform.IPhonePlayer) { _CalliOSWebView("http://habrahabr.ru", Application.dataPath + "/Raw/test.html"); } }
मुझे लगता है कि यहां सब कुछ स्पष्ट होना चाहिए, सिवाय शायद दूसरे तर्क के लिए कॉल में _CalliOSWebView। यह आईओएस डिवाइस के फाइल सिस्टम में सेव की गई फाइल को संदर्भित करता है। लेकिन हम उसे वहाँ कैसे लगाते हैं? इसके लिए, StreamingAssets एकता में मौजूद है (इस फ़ोल्डर में रखी गई फाइलें परियोजना के निर्माण के बाद अपरिवर्तित रहेंगी)। इस फ़ोल्डर को बनाएं और हमारे test.html को वहां रखें। अब वेब दृश्य प्रदर्शित करने के लिए, आपको यूनिट से CallForWebPage () कॉल करना होगा, लेकिन बैक बटन के साथ एक प्रश्न होगा। इसे निम्नानुसार हल किया जा सकता है। हम इकाई के दृश्य को सहेजते हैं, हम अपने वेब दृश्य को एम्बेड करते हैं, एक बटन के क्लिक पर हम इकाई के दृश्य को पुनर्स्थापित करते हैं। एकमात्र समस्या यह है कि एकता को इसकी जानकारी नहीं है, और खेल, ध्वनियाँ जारी हैं। लेकिन अगर वांछित है तो यह आसानी से हल हो गया है। बटन का कार्यान्वयन नीचे प्रस्तुत किया गया है:
@implementation WebViewCaller UIViewController *unityViewController; UIWindow* window; -(IBAction)quitBack:(id)sender { [window setRootViewController:unityViewController]; } -(void) callViewWithOnlineHtml:(NSString*) _onlineHtml withOfflineHtml:(NSString*) _offlineHtml { WebController* webController = [[TEWebController alloc] initWithOnlineHtml:_onlineHtml withOfflineHtml:_offlineHtml]; window = [[UIApplication sharedApplication] keyWindow]; unityViewController = [UIApplication sharedApplication].keyWindow.rootViewController; [window setRootViewController:webController]; UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [button addTarget:self action:@selector(quitBack:) forControlEvents:UIControlEventTouchUpInside]; [button setTitle:@"<<" forState:UIControlStateNormal]; button.frame = CGRectMake(0, 0, 160.0, 40.0); [window addSubview:button]; [webController release]; } @end void _CalliOSWebView(const char *onlineHtml, const char *offlineHtml) { NSString *onlineHtmlString = [[NSString alloc] initWithUTF8String:onlineHtml]; NSString *offlineHtmlString = [[NSString alloc] initWithUTF8String:offlineHtml]; WebViewCaller *caller = [[WebViewCaller alloc] init]; [caller callViewWithOnlineHtml:onlineHtmlString withOfflineHtml:offlineHtmlString]; [onlineHtmlString release]; [offlineHtmlString release]; }
केवल शेष प्रश्न यह है कि यह सब कैसे डिबग करें। मैंने इसे अपने लिए इस प्रकार तय किया। हम उस फ़ोल्डर में जाते हैं जहां हमने iOS प्रोजेक्ट एकत्र किया था। इसे xCode से खोलें, संपादित करें, डीबग करें और जो कुछ भी हम चाहते हैं (मैं आपको याद दिलाता हूं कि हमारे प्लग इन लाइब्रेरी फ़ोल्डर में हैं)। फिर हम फ़ोल्डर "/ pathToYourProject / Assets / Plugins / iOS /" में अपनी कक्षाओं में परिवर्तन की प्रतिलिपि बनाते हैं।
बस इतना ही। यदि वेबकंट्रोलर वर्ग को सही ढंग से लिखा गया है, तो सब कुछ शुरू हो जाएगा और काम करेगा। मैंने पहले ऑब्जेक्टिव-सी पर प्रोग्रामिंग नहीं की, और कुछ चीजें पेशेवरों को अनाड़ी और टेढ़ी लग सकती हैं, जिसके लिए मैं माफी मांगता हूं, लेकिन मुझे उम्मीद है कि मैं मुख्य विचार को बता सकता हूं कि प्लग-इन को कैसे जोड़ा जाए, और मुझे उम्मीद है कि मैं कम से कम कुछ बचा सकता हूं काम के घंटे। आपका ध्यान देने के लिए धन्यवाद।
जिनके लिए एकता में रुचि है, मैं निम्नलिखित संसाधनों की सलाह दे सकता हूं:
unity3d.com - आधिकारिक साइट;
answers.unity3d.com - सवाल और जवाब। सबसे अधिक, मेरी राय में, एक उपयोगी संसाधन;
forum.unity3d.com - एकता के बारे में मंच;
docs.unity3d.com - आधिकारिक दस्तावेज।