ইউনিটিতে, কেন একটি ভেক্টর 2 এবং একটি ভেক্টর 3 অস্পষ্ট কিন্তু যুক্ত করা হচ্ছে না?


11

নিম্নলিখিত দুটি ভেক্টর দেওয়া:

Vector3 v3 = Vector3.one;
Vector2 v2 = Vector2.one;

এই লাইনটি অস্পষ্ট:

v3 += v2; // Unity reports dimension ambiguity

যদিও এই কার্যভারটি নয়:

v3 = v2; // Unity assigns despite different dimensions

কেন?


সুতরাং, দুর্দান্ত উত্তরের জন্য আন্তো এবং জাভি মন্টেরোকে আপনাকে অনেক ধন্যবাদ। সমস্যাটি পুনরুত্পাদন করার চেষ্টা করে বুঝলাম আমার প্রশ্নটি পরিবর্তন করা উচিত। ট্র্যাক্সফর্ম.পজিশনে কোনও ভেক্টর 2 নিয়োগের সময় ঘটনাটি ঘটছে যাতে রূপান্তর.পজিশন = এ + বি; যেখানে দু'এ এবং বি হ'ল ভেক্টর 2 সঠিকভাবে সংকলন করে এবং এটি এক্স এবং y নির্ধারণ করে! পরিবর্তে, যখন আমি লাইনটি রূপান্তর করি। পজিশন + = এ; // অথবা খ আমি ইউনিটি 5.0.0f ব্যবহার করছি এবং স্ক্রিপ্টটি কোনও ইউআই উপাদান (চিত্র) এর সাথে সংযুক্ত আছে যা সংকলককে প্রভাবিত করে না তবে আপনার দৃশ্যের পুনরুত্পাদন করার জন্য গুরুত্বপূর্ণ তথ্য হতে পারে।
স্টেকওভারফ্লো

তাই তোমরা বলো আমাকে কী করতে হবে। আমরা কি সেই অনুসারে প্রশ্ন এবং আপনার উত্তরগুলি পরিবর্তন করব বা আমরা একটি নতুন শুরু করব?
স্টেকওভারফ্লো

ভেক্টর 3 + ভেক্টর 2 এবং ভেক্টর 3 + = ভেক্টর 2 আপনি যা চান তা বিবেচনা করে কখনই কাজ করবে না কারণ উভয়ই একে অপরের সাথে রূপান্তরিত হতে পারে এবং আপনি যা করতে চান তা অনুসারে আপনাকে স্পষ্টতই কাস্ট করতে হবে। ভেক্টর 3 = ভেক্টর 2 কাজ করে কারণ কোনও অস্পষ্টতা নেই। আমি কোনও নতুন প্রশ্ন পরিবর্তন বা পোস্ট করার প্রয়োজন দেখছি না।

আমি প্রশ্নটি পরিবর্তন করতে বলছি কারণ আমি যে বর্ণনা করেছি তার থেকে কেস কিছুটা আলাদা, যা আপনার উত্তরের প্রবাহকে ভেঙে দিতে পারে।
স্টেকওভারফ্লো

না চিন্তা করবেন না, কিছু ভেঙে নেই।

উত্তর:


12

সম্পূর্ণ ইস্যু বার্তা:

ত্রুটি CS0121: কলটি নিম্নলিখিত পদ্ধতি বা বৈশিষ্ট্যগুলির মধ্যে দ্ব্যর্থক: UnityEngine.Vector2.operator +(UnityEngine.Vector2, UnityEngine.Vector2)' andইউনিটিইজাইন.ভেক্টর 3.অপারেটর + (ইউনিটিইজাইন.ভেক্টর 3, ইউনিটিইজাইন.ভেক্টর 3) '

ইউনিটি একটি উপায় পরোক্ষভাবে একটি রূপান্তর প্রদান করা Vector3একটি থেকে Vector2এবং ভাইস বিপরীতভাবে। এটি আপনার ক্ষেত্রে একটি অস্পষ্টতার কারণ কারণ উভয় + অপারেটর প্রয়োগ করা যেতে পারে।

Vector2আপনাকে Vector3সেই অপারেশনে একটি স্পষ্টভাবে কাস্ট করুন , যাতে সংকলকটি ব্যবহার করতে জানে UnityEngine.Vector3.operator +(UnityEngine.Vector3, UnityEngine.Vector3)

আপনি যদি কৌতূহলী হন তবে সেই নির্দিষ্ট ত্রুটির জন্য মাইক্রোসফ্টের ডক্স এখানে রয়েছে


আপনার সম্পাদনার পরে সম্পাদনা করুন:

Vec3 += Vec2উপরে বর্ণিত একই কারণে অস্পষ্ট। Vec3 += Vec2বাস্তবে থাকার কথা ভাবুন Vec3 = Vec3 + Vec2। অন্তর্নিহিত রূপান্তরগুলির কারণে এবং উত্তর হিসাবে Vec3 + Vec2উভয়ই উত্পন্ন করতে পারে , এজন্য আপনাকে যা চান তা নির্দিষ্ট করতে হবে।Vector2Vector3

Vec3 = Vec2অস্পষ্ট নয় কারণ ভেক 2 সুস্পষ্টভাবে একটিতে রূপান্তরিত হয় Vector3এবং তারপরে প্রাথমিক ভেক 3-তে নির্ধারিত হয়। সুতরাং পুরো অপারেশনটি Vector3 = Vector3আপনাকে কোনও Vector3ম্যানুয়ালি ভেক 2 নিক্ষেপ না করেই সত্য ।


সুতরাং ityক্যটি ধরে নিয়েছে যে আমি আমার ভেক্টর 3 এর x এবং y কে আমার ভেক্টর 2 এর এক্স এবং y থেকে আমার জেড 0f এ সেট করতে চাই। রাইট?
স্টেকওভারফ্লো

হ্যাঁ, ভেক 3 = ভেক 2 ভেক 3 = (ভেক্টর 3) ভেক 2 এর সমতুল্য হওয়ার কথা কল্পনা করুন। আপনাকে ম্যানুয়ালি castালাই করার দরকার নেই কারণ এ ক্ষেত্রে এটি ছাড়া অন্য কিছু হতে পারে না।

হ্যাঁ, আসলে আমার প্রশ্নের শিরোনাম এমন কিছু হতে পারে "ভেক্টর 2 নির্ধারণের সময় আমাকে কেন ভেক্টর 3 তে নিক্ষেপ করার দরকার নেই"। আমি নিখুঁত প্রশ্নের শিরোনাম এবং কারুকাজ করার ক্ষেত্রে সেরা নই: / অ্যালেক্স আপনাকে ধন্যবাদ। আমার কৌতূহল সন্তুষ্ট হয়েছে (শেষ)।
স্টেকওভারফ্লো

3

আমি যুদ্ধগুলির নাম পরিবর্তন করতে পারি (স্পষ্টতার জন্য):

Vector3 pos3d = new Vector3 (1f, 2f, 3f);
Vector2 pos2d = new Vector2 (1f, 2f);

উত্তর

এটি pos3d + pos2dলাইনের বিভাগের কারণে । এই অংশটি আসলেই অস্পষ্ট, যদিও +=তা নয়। কেন একটি এবং অন্যটি কেন তা স্পষ্ট করে বলি।

বিশ্লেষণ ঘ

এই লাইনে

transform.position = pos3d + pos2d;

সংকলক প্রথমে pos3d + pos2dএগিয়ে যাওয়ার আগে অভিব্যক্তিটি মূল্যায়ন করার চেষ্টা করে , ফলাফলটি কোথায় স্থান দেওয়া হচ্ছে তা নির্বিশেষে।

এটি করার জন্য, সিস্টেমটি প্রথমে কোনও পাবলিক স্ট্যাটিক ফাংশন সন্ধান করার চেষ্টা করে যা একটি ভেক্টর 3 এবং একটি ভেক্টর 2 যুক্ত করে, উদাহরণস্বরূপ এই সম্ভাব্য স্বাক্ষর:

public static Vector3 operator +(Vector3 a, Vector2 b);

বা উদাহরণস্বরূপ এই সম্ভাব্য স্বাক্ষর:

public static Vector2 operator +(Vector3 a, Vector2 b);

তবুও এপিআই-তে সেই স্বাক্ষরগুলির কোনও নেই তাই সংকলক পরিচিত স্বাক্ষরগুলিতে পরামিতিগুলি "কাস্ট" করার চেষ্টা করে।

তারপরে সংকলকটি সেই দুটি সম্ভাব্য স্বাক্ষর খুঁজে পেয়েছে:

public static Vector3 operator +(Vector3 a, Vector3 b);
public static Vector2 operator +(Vector2 a, Vector2 b);

এগুলি এখানে নথিভুক্ত করা হয়েছে: http://docs.unity3d.com/ScriptReferences/Vector3-operator_add.html এবং এখানে: http://docs.unity3d.com/ScriptReferences/Vector2-operator_add.html

সুতরাং দুটি সম্ভাবনা রয়েছে:

উভয় ingsালাই সম্ভব যেমন, pos2d একটি ভেক্টর 3 এ কাস্ট করা যায় এবং পোস্ট 3 ডি একটি ভেক্টর 2-তে কাস্টাবল করা যায়, সংকলক তার পরে একই উত্স কোডটি সংকলনের সম্ভাব্য উপায়গুলি খুঁজে পায় (স্বয়ংক্রিয়ভাবে লুকানো কাস্টিংগুলি স্থানে থাকে)।

হয় ভেক্টর 2 এ পোস্ট 3 ডি কাস্ট করা এবং দ্বিতীয় স্বাক্ষর নিয়ে এগিয়ে যাওয়া সম্ভব হয়, অথবা হয় পোস্ট 2 ডি ভ্যাক্টর 3 এ কাস্ট করে প্রথম স্বাক্ষর দিয়ে এগিয়ে যেতে হয়।

যেহেতু প্রথমে অভিব্যক্তিটি pos3d + pos2dমূল্যায়ন করা হয়, "ফলাফলটি কোথায় প্রয়োগ করা হবে" বিবেচনার আগে সংকলকটি জানেন না আপনি কী নিক্ষেপ করবেন - যেমন কোডার এটি সম্পাদন করতে পছন্দ করবে।

আপনি যদি 3D এর দিকে যেতে চান তবে আপনি এটি লিখতে পারেন:

transform.position = pos3d + ( Vector3 )pos2d;

এবং সমস্যাটি চলে গেছে, যেমন এটি স্পষ্ট: শর্ত থাকে যে এই স্থির স্বাক্ষর আছে

public static Vector3 operator +(Vector3 a, Vector3 b);

উপলব্ধ, এটি কোনওরকম কোনও অস্পষ্টতার সাথে ব্যবহার করা হবে।

বিশ্লেষণ 2

অন্যদিকে, যখন আপনি করবেন

transform.position = pos3d;
transform.position += pos2d; 

কোনও অস্পষ্টতা নেই: প্রথম লাইন একটি ভেক্টর 3কে ভেক্টর 3 এ নির্ধারিত করে (সন্দেহ নেই)।

দ্বিতীয় লাইন সমান

transform.position = transform.position + pos2d;

নির্দিষ্টতার সাথে ট্রান্সফর্ম.পজিশনটি কেবল একবার মূল্যায়ন করা হয়, এবং তাই এই ধরণের বিষয়টি বিবেচনা করা হয়, যেমন আপনি +=অপারেটর সম্পর্কে এই মাইক্রোসফ্ট পৃষ্ঠায় দেখতে পারেন :

https://msdn.microsoft.com/en-us/library/sa7629ew.aspx

এটি অতিরিক্ত হিসাবে বলেছে যে "+ + অপারেটর সরাসরি ওভারলোড করা যায় না, তবে ব্যবহারকারী-সংজ্ঞায়িত প্রকারগুলি + অপারেটরটিকে ওভারলোড করতে পারে (অপারেটর দেখুন)"। তাই আমরা চিন্তা করা উচিত Vector3'র +=অপারেটর হিসাবে মাইক্রোসফট দ্বারা বর্ণিত এটা বলছেন যেখানে কাজ করে:

x += y

সমতুল্য

x = x + y

যে এক্স বাদে শুধুমাত্র একবার মূল্যায়ন করা হয়। + অপারেটরের অর্থ x এবং y এর ধরণের উপর নির্ভর করে (সংখ্যাসূচক অপারেণ্ডগুলির জন্য সংযোজন, স্ট্রিং অপারেন্ডসের জন্য সংক্ষিপ্তকরণ এবং আরও কিছু)।

সুতরাং আমরা নিশ্চিত হতে পারি যে দ্বিতীয় পদ্ধতির Vector3ক্লাসের + অপরেন্ডকে আহ্বান জানানো হয়েছে, যার স্বাক্ষর রয়েছে:

public static Vector3 operator +(Vector3 a, Vector3 b);

সুতরাং এটি অর্জনের আর কোনও উপায় নেই যা কোনও অন্য রূপ হতে পারে না এমন অন্তর্নিহিত গোপন কাস্টিকে ধন্যবাদ পোস্ট 2 ডি কে ভেক্টর 3 এ রূপান্তর করা ছাড়া।

সাহায্য আশা করি !!


সম্পাদন করা

ইন Unity 5.0.1f1 Personalসঙ্গে MonoDevelop-Unit 4.0.1, আলেক্স এম বলেছেন, লাইন:

transform.position = pos3d;
transform.position += pos2d;

তবুও ত্রুটি নিক্ষেপ করুন "Assets/Scripts/CubeScript.cs(15,27): error CS0121: The call is ambiguous between the following methods or properties: 'UnityEngine.Vector2.operator +(UnityEngine.Vector2, UnityEngine.Vector2)' and 'UnityEngine.Vector3.operator +(UnityEngine.Vector3, UnityEngine.Vector3)'"

সুতরাং সত্যিই + = উভয় স্বাক্ষর ব্যবহার করছে

public static Vector3 operator +(Vector3 a, Vector3 b);
public static Vector2 operator +(Vector2 a, Vector2 b);

ফলাফল "কোথায়" রাখা হবে তা আগেই জেনে থাকার সত্যতা নির্বিশেষে (আমার ধারণা কারণ কোনও ভেক্টর 2 আউটপুট সংগ্রহ করা গন্তব্যে (ভেক্টর 3) নিক্ষেপযোগ্য এবং যদি সম্ভবত এই কাস্টটি সম্ভব না হত, সম্ভবত, সংকলকটি যথাযথের সাথে একটিটি বেছে নেবে আউটপুট টাইপ)।

অ্যালেক্স এম পয়েন্টটির জন্য ধন্যবাদ


+=হয় না কাজ করে, এটি এখনও একটি Vector3+ Vector2। আমার উত্তর দেখুন।

ডান, আপভোটেড আপনার, আমার সম্পাদনা করবে।
জাভি মন্টেরো

আপনার মন্তব্য অন্তর্ভুক্ত করতে কেবল সম্পাদিত।
জাভি মন্টেরো

transform.position + = pos2d সংকলন করছে। আগামীকাল আমি আরও নির্ভুল হয়ে
উঠব

সম্পাদনার পরে আমি ক্রমটিতে হারিয়ে গেলাম ... সুতরাং ... pos3d += pos2d(আপনার সম্পাদিত প্রশ্ন অনুসারে) ব্যর্থ হয়েছে তবে transform.position += pos2dসংকলন করে (উপরে আপনার মন্তব্য অনুসারে) ?? যেমনটি অদ্ভুত বলে মনে .positionহবে Vector3- আপনি যা বোঝাতে চাইছেন তা পরিষ্কার করে দেখতে পাচ্ছেন না।
জাভি মন্টেরো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.