C # แตกต่างใน Unity หรือไม่


18

Unity ใช้ C # ในเวอร์ชันอื่นหรือเหมือนกันทั้งหมดหรือไม่ มันดูแตกต่างจาก C # ปกติ แต่มีองค์ประกอบ C # ปกติอยู่ในนั้น


4
คุณเห็นความแตกต่างอะไร
Anko

ฉันสงสัยว่าการเปลี่ยนแปลงที่คุณอ้างถึงนั้นเป็นความแตกต่างของกรอบงานไม่ใช่ภาษา C # ใน Unity3d คุณกำลังใช้เฟรมเวิร์ก. Net (Via Mono) และองค์ประกอบเฉพาะของ Unity framework ด้วยภาษา C #
Mike B

มันเป็นรุ่นเก่ามาก หากคุณต้องการเวอร์ชั่นล่าสุดของ C # และ Mono และต้องการเขียนโปรแกรมแทนที่จะเขียนสคริปต์เป็นเครื่องมือที่สร้างไว้ล่วงหน้าแล้วลองพิจารณาสิ่งต่าง ๆ เช่นmonogame.net
Den

ฉันสังเกตเห็นความแตกต่างของห้องสมุดเล็กน้อยเช่นใน Unity จะมีคลาส Mathf สำหรับฟังก์ชันคณิตศาสตร์แทนที่จะเป็นคลาส Math ฉันไม่ได้สนใจถ้ามีความแตกต่างอื่น ๆ แต่นั่นเป็นสิ่งที่โดดเด่น
Alex

@ Alex System.Mathยังคงมีอยู่และเห็นได้ชัดเป็นจริงได้เร็วขึ้นกว่าUnityEngine.Mathf ดังนั้นเหตุผลที่แท้จริงเพียงอย่างเดียวในการใช้เวอร์ชัน Unity คือการหลีกเลี่ยงการปลดเปลื้องจำนวนมาก .. ด้วยค่าใช้จ่ายของประสิทธิภาพบางอย่าง
FlintZA

คำตอบ:


9

ตามที่ระบุไว้ในคำตอบอื่น ๆ Unity 4.x ใช้Mono รุ่นที่แก้ไขแล้วตามMono 2.6

ส่วนใหญ่มันใช้งานได้กับ. Net 2.0แต่ฉันก็ยังไม่สามารถติดตามรายการความเข้ากันได้เฉพาะของ Mono 2.6 ได้

มันดูแตกต่างจาก C # ปกติ แต่มีองค์ประกอบ C # ปกติอยู่ในนั้น

ดังที่กล่าวไว้ในหนึ่งในความคิดเห็นเกี่ยวกับคำถามของคุณน่าจะเป็นเพราะ API สคริปต์เฉพาะของ Unity มากกว่าภาษานั้น

เป็นตัวอย่างรหัสจำนวนมากในโครงการ Unity ทั่วไปมีอยู่ในคลาสย่อยของคลาสที่เรียกว่า MonoBehavior เหล่านี้คือส่วนประกอบที่ถูกทิ้งบน GameObjects ภายในสภาพแวดล้อม Unity Editor สถาปัตยกรรมนี้นำไปสู่รหัส C # ที่มีลักษณะแตกต่างจากรหัสทั่วไป C # (สำหรับฉันอยู่ดี) ในหลายวิธี:

  • จนกว่าจะปล่อย Unity 4 วัตถุเหล่านี้ไม่สามารถอยู่ในเนมสเปซดังนั้นพวกมันจึงมักจะอยู่ในเนมสเปซส่วนกลาง
  • พวกเขาเปิดเผยเขตข้อมูลสู่สภาพแวดล้อมของตัวแก้ไขโดยทำให้เป็นสาธารณะ (หรือโดยใช้แอตทริบิวต์ SerializeField แต่ฉันพบว่ามีคนใช้งานน้อยมาก) ซึ่งนำไปสู่ฟิลด์สาธารณะจำนวนมากในชั้นเรียนที่ผิดปกติ
  • ความเป็นส่วนตัวและข้อตกลงกรณีของ Unity ไม่เป็นไปตาม Microsoft ดังนั้นสิ่งนี้อาจดูแปลกสำหรับนักพัฒนา C # แบบดั้งเดิม
  • พวกเขาใช้วิธีพิเศษจำนวนมากในส่วนประกอบเหล่านี้เช่นเริ่มต้นและอัปเดตซึ่งไม่ได้มีการแทนที่อย่างที่คาดหวังโดยทั่วไป แต่จะเข้าถึงได้โดยใช้วิธีการสะท้อนแทน

พูดจริงคุณลักษณะภาษา C # ที่ใหญ่ที่สุดที่ฉันพลาดในรุ่น C # ปัจจุบันของ Unity คือการสนับสนุนasyncและคำหลักและฟังก์ชั่นที่เกี่ยวข้อง แนวคิดที่คล้ายกันในความสามัคคีเป็นcoroutines สิ่งเหล่านี้ดำเนินการบนเธรดหลักดังนั้นจึงไม่เป็นความจริงแบบอะซิงโครนัส แต่อนุญาตให้โค้ดที่รันเป็นเวลานานถูกทำลายในหลายเฟรม มัลติเธรดระดับต่ำกว่ายังคงได้รับการสนับสนุน


2
เพียงเพื่อชี้แจงasyncใน C # ก็ไม่จริง async เช่นเดียวกับในแบบมัลติเธรด - มันยังทำงานบนเธรดหลัก ความแตกต่างที่ยิ่งใหญ่ที่สุดจากมุมมองการใช้งานระหว่าง coroutines และ async เป็นเวลาที่รหัสทำงาน
rhughes

ขอบคุณ ใช่ async! = multithreaded แม้ว่าฉันจะบอกว่ามันเป็นเรื่องธรรมดามากที่จะใช้ async เพื่อซ่อน / โต้ตอบกับการดำเนินการแบบมัลติเธรดกว่ามันจะต้องทำแบบเดียวกันกับ coroutines ฉันได้เขียน coroutine wrapper ที่เริ่มงานมอบหมายใน threadpool ซึ่งทำให้ฉันมีระดับความยืดหยุ่นที่คล้ายกันมาก แต่ฉันก็ยังไม่ทราบว่าจะมีการสนับสนุน async "เหมาะสม" แน่นอน GC สมัยใหม่ที่ดีจะดียิ่งขึ้น;)
FlintZA

21

Unity 4 ใช้ Mono 2.6ซึ่งเป็นการนำเฟรมเวิร์ก. NET รวมถึงภาษา C # มาใช้อย่างสมบูรณ์

ฉันไม่แน่ใจว่ามันมีลักษณะแตกต่างกันอย่างไร แต่โปรดจำไว้ว่า Unity รองรับหลายภาษาซึ่งทั้งหมดนี้ใช้งานได้กับโมโนรันไทม์เดียวกัน เป็นไปได้หรือไม่ที่คุณสับสนC # กับ UnityScript ?


10
หากต้องการเพิ่ม Mono 2.6 จะเทียบเท่ากับ C # 3.0 ในแง่ของคุณสมบัติภาษา Mono 2.6.1 เริ่มเพิ่มคุณสมบัติ C # 4.0
คูเปอร์

นี่เป็นภาพรวมที่ดีเกี่ยวกับความเข้ากันได้ Monoของ Unity ตั้งแต่ v4.1.2
Kelly Thomas

มันล่าช้าไม่ได้เป็นเพียงเล็ก ๆ น้อย ๆ แต่รุ่นใหญ่ที่เพิ่มขึ้น: mono-project.com/Release_Notes_Mono_3.4
Den

3

Unity ใช้ C # ปกติ

จากนั้นอีกครั้งเมื่อคุณเขียน C # ใน Unity คุณจะใช้ห้องสมุดจำนวนมาก แต่เท่าที่ฉันรู้ทุกสิ่งที่เป็นไปได้ใน C # นั้นเป็นไปได้ใน Unity นอกเหนือจากความแตกต่างที่แสดงด้านล่าง:

  • พื้นที่ที่เฉพาะเจาะจงมากขึ้นของ. Net ที่เกี่ยวข้องกับ Windows Forms & ASP ถูก จำกัด การใช้งานผ่าน Unity

  • ในขณะที่คุณสามารถใช้ Visual Studio สำหรับการแก้ไขและรวบรวมข้อผิดพลาดเวลาคุณต้องสร้างและเรียกใช้ใน Unity IDE

  • Unity ใช้ Mono ซึ่งเป็นการใช้งานโอเพ่นซอร์สของ. Net ซึ่งหมายความว่ามีความแตกต่างเล็กน้อย


เพื่อขยายกระสุนที่สองของคุณ - คุณยังสามารถแก้ปัญหาภายใน Visual Studio โดยใช้UnityVS Microsoft เพิ่งได้รับนักพัฒนาดังนั้นพวกเขาจะปล่อยปลั๊กอินฟรีในอนาคตอันใกล้
mrohlf

ขออภัยไม่มีที่ไหนใกล้กับ C # ปกติ
Alper

0

คำถามที่ว่า C # เวอร์ชั่นที่ Unity ใช้นั้นแตกต่างจาก C # แบบปกติหรือไม่นั้นได้รับการตอบจากโพสต์อื่น เนื่องจากคุณกำลังขอองค์ประกอบบางอย่างที่อาจแตกต่างจากรุ่นปกติอย่างชัดเจนฉันจะแบ่งปันความแตกต่างเพียงเล็กน้อยที่ฉันสังเกตเห็นเมื่อเปรียบเทียบ C # ที่ฉันใช้ในที่ทำงาน (เช่น C # 4.0 ใน Visual Studio 2010 และสูงกว่า) และ C # ใน Unity ซึ่ง คือฉันไม่สามารถใช้ค่าเริ่มต้นสำหรับพารามิเตอร์ในนิยามฟังก์ชันได้ สิ่งที่คุณต้องตั้งค่าโครงการของคุณอย่างรอบคอบมากขึ้นเพื่อใช้ C # รุ่นที่ใหม่กว่า ดูลิงค์นี้สำหรับคำอธิบายเพิ่มเติม

แก้ไข: ฉันปล่อยให้คำตอบนี้ตั้งแต่เท่าที่ฉันรู้ว่านี่เป็นความเข้าใจผิดที่เกิดขึ้นกับคนจำนวนมาก


เนื่องจากคุณสมบัติดังกล่าวถูกเพิ่มใน C # ในรุ่น 4.0 เท่านั้นและไม่เคยปรากฏมาก่อนจึงไม่มีตัวตนนี้จึงไม่สามารถเรียกว่า
หรือผู้ทำแผนที่

1
C # เวอร์ชัน 4 เปิดตัวในปี 2010 ฉันคิดว่าผู้คนจำนวนมากใช้มันและรู้สึกเหมือนฉันไม่มีตัวตนเมื่อเขียนโปรแกรมใน Unity
Nessuno

คุณแน่ใจหรือว่าไม่สามารถใช้ค่าเริ่มต้นได้ ฉันค่อนข้างแน่ใจว่าฉันทำและมี ...
NPSF3000

ฉันลองแล้วมันจะไม่คอมไพล์ด้วยข้อความบอกฉันว่าฉันไม่สามารถใช้ค่าเริ่มต้นได้ คุณกำลังใช้ Unity รุ่นพิเศษหรือไม่? ชอบรุ่นโปรใช่ไหม
Nessuno

1
คุณสามารถใช้ค่าเริ่มต้นได้อย่างแน่นอนและไม่มีส่วนเกี่ยวข้องกับโปรหรือไม่ใช้มืออาชีพ Unity และ MonoDevelop มีความสัมพันธ์ที่แปลก โครงการที่สร้างขึ้นอัตโนมัติใน MonoDevelop มักถูกตั้งค่าเป็น C # รุ่นก่อนหน้าซึ่งไม่สนับสนุนค่าเริ่มต้น อย่างไรก็ตามหากคุณเปลี่ยนการตั้งค่าในโครงการมันจะใช้ได้ดี หากคุณไม่สนใจการคอมไพล์ใน MonoDevelop และกลับไปที่ Unity คุณจะทราบว่า Unity ไม่ได้บ่นเกี่ยวกับพารามิเตอร์เริ่มต้น
MrCranky
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.