নিম্নলিখিত দুটি ভেক্টর দেওয়া:
Vector3 v3 = Vector3.one;
Vector2 v2 = Vector2.one;
এই লাইনটি অস্পষ্ট:
v3 += v2; // Unity reports dimension ambiguity
যদিও এই কার্যভারটি নয়:
v3 = v2; // Unity assigns despite different dimensions
কেন?
নিম্নলিখিত দুটি ভেক্টর দেওয়া:
Vector3 v3 = Vector3.one;
Vector2 v2 = Vector2.one;
এই লাইনটি অস্পষ্ট:
v3 += v2; // Unity reports dimension ambiguity
যদিও এই কার্যভারটি নয়:
v3 = v2; // Unity assigns despite different dimensions
কেন?
উত্তর:
সম্পূর্ণ ইস্যু বার্তা:
ত্রুটি 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
উভয়ই উত্পন্ন করতে পারে , এজন্য আপনাকে যা চান তা নির্দিষ্ট করতে হবে।Vector2
Vector3
Vec3 = Vec2
অস্পষ্ট নয় কারণ ভেক 2 সুস্পষ্টভাবে একটিতে রূপান্তরিত হয় Vector3
এবং তারপরে প্রাথমিক ভেক 3-তে নির্ধারিত হয়। সুতরাং পুরো অপারেশনটি Vector3 = Vector3
আপনাকে কোনও Vector3
ম্যানুয়ালি ভেক 2 নিক্ষেপ না করেই সত্য ।
আমি যুদ্ধগুলির নাম পরিবর্তন করতে পারি (স্পষ্টতার জন্য):
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);
উপলব্ধ, এটি কোনওরকম কোনও অস্পষ্টতার সাথে ব্যবহার করা হবে।
অন্যদিকে, যখন আপনি করবেন
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) নিক্ষেপযোগ্য এবং যদি সম্ভবত এই কাস্টটি সম্ভব না হত, সম্ভবত, সংকলকটি যথাযথের সাথে একটিটি বেছে নেবে আউটপুট টাইপ)।
অ্যালেক্স এম পয়েন্টটির জন্য ধন্যবাদ
pos3d += pos2d
(আপনার সম্পাদিত প্রশ্ন অনুসারে) ব্যর্থ হয়েছে তবে transform.position += pos2d
সংকলন করে (উপরে আপনার মন্তব্য অনুসারে) ?? যেমনটি অদ্ভুত বলে মনে .position
হবে Vector3
- আপনি যা বোঝাতে চাইছেন তা পরিষ্কার করে দেখতে পাচ্ছেন না।