рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореБрдЭреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд░реБрдЪрд┐ рд╣реЛ рдЧрдИ рд╣реИ, рдФрд░ рдЬрдм рдореИрдВ рдПрдХ рднрд╛рд╖рд╛ рдЪреБрдирддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рджреЛ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд╕рдВрдж рдерд╛ рдЬреЛ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╕рдВрдж рд╣реИ - рд╣рд╛рд╕реНрдХреЗрд▓ рдФрд░ рдПрдл # ред
F # рдореЗрдВ, рдореБрдЭреЗ рдкреНрд░рд▓реЛрднрди рджрд┐рдпрд╛ рдЧрдпрд╛ рдХрд┐ рдЗрд╕реЗ MSIL рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЕрдиреНрдп Microsoft .Net рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ F # рдХреНрд▓рд╛рд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЗрд╕ рддрдереНрдп рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рд╕реНрд╡рдпрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрд╕рдХреЗ рд╢реАрд░реНрд╖ рдкрд░, рдореИрдВ рдПрдХ рд╢реБрд░реБрдЖрддреА рдпреВрдирд┐рдЯреА 3 рдбреА рдбреЗрд╡рд▓рдкрд░ рднреА рд╣реВрдВ, рдФрд░ рдореЗрд░реЗ рд╕рд╛рде рдпрд╣ рд╣реБрдЖ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдПрдордПрд╕рдЖрдИрдПрд▓ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдЖрдк рдПрдХрддрд╛ рдореЗрдВ рдПрдл # рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? Googling рдиреЗ рдЬрд╡рд╛рдм рджрд┐рдпрд╛: рдорд╛рдирд╡реАрдп рд░реВрдк рд╕реЗ рдЕрд╕рдВрднрд╡ред рдЖрдк рдПрдХ рдХреНрд▓рд╛рд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ UnityEngine.dll рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдВрдХ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдПрдХ рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд╕реАрдзреЗ рдореЛрдиреЛ-рд╡реНрдпрд╡рд╣рд╛рд░ рдШрдЯрдХ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рд╕рд╣рдордд рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, Google, рдкрд░рд╛рд╡рд░реНрддрди рдФрд░ рдПрдХрддрд╛ рдХреА рдорджрдж рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЕрднреА рднреА рд╕рдВрдкрд╛рджрдХ рдХреЗ рдЕрдВрджрд░ рдПрдл # рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рд▓рдЧрднрдЧ рдЙрд╕реА рддрд░рд╣ рдЕрдиреБрдорд╛рдирд┐рдд (рд▓реЗрдХрд┐рди рдмрд┐рд▓реНрдХреБрд▓ рджреЛрд╣рд░рд╛ рдирд╣реАрдВ) рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд┐рд╡рд░рдг рдЖрд╡рд╛рд╕ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рд╣реИрдВред
рднрд╛рдЧ рд╢реВрдиреНрдп
рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ рдХреБрдЫ рдЧрд▓рдд рдХрд┐рдпрд╛ (рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ), рдФрд░ рджреЛрдиреЛрдВ рд╕рдХрд▓ рдФрд░ рдмрд╣реБрдд рдЧрд▓рддрд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ (рдлрд┐рд░ рднреА, рдореБрдЭреЗ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд░ рдпрд╛ рдпрд╣ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА) рдПрдХ рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдмреЗрд╣рддрд░ / рд╕реБрдВрджрд░ рд╣реИ)ред рдПрдХ рдЯреЗрд▓рдорд╛рд╕реНрдЯрд░ рдкреНрд░рднрд╛рд╡ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ / рдЧрдбрд╝рдмрдбрд╝рд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред рдореИрдВ рд╕рд┐рд░реНрдл рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реВрдВред рдХреГрдкрдпрд╛ рд╕рдордЭ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВред рдЕрдВрдд рдореЗрдВ, рдпрд╣реА рд╡рд╣ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдФрд░ рд╢реБрд░реБрдЖрддреА рдХреЛ рд╕реАрдЦрдиреЗ, рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реБрдзрд╛рд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ!
рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рд╣рд╛рдмрд░рд╛рдм рдХреЗ рдордзреНрдпрд╕реНрдереЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рдж рдХрд┐ рдореЗрд░реЗ рдЕрдиреБрд░реЛрдз рдкрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рд╡рд┐рд╖рдп рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рднреЗрдЬрд╛, рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ, рдбреНрд░рд╛рдлреНрдЯ рдореЗрдВред рдЕрдм рд╕реЗ, рдореИрдВ рдЕрдзрд┐рдХ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реВрдВрдЧрд╛ред
рдПрдХ рднрд╛рдЧ
рдпрд╣ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ
рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдмрдиреНрд╕ рдХреЗ рджрд┐рдЦрддрд╛ рд╣реИред рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╕рд░рд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдХрд░реВрдБрдЧрд╛ред рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ:
(рд╣рд╛рд╕реНрдХреЗрд▓ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдФрд░ рдиреАрдЪреЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдПрдл # рд╣реИ)
//Please, don't try to change namespace namespace Assembly_FSharp_vs open UnityEngine; type public SphereMoving () = inherit UnityEngine.MonoBehaviour() member public this.Start () = UnityEngine.Debug.Log("initialized") member public this.Update() = let mutable newpos:Vector3 = Vector3.zero newpos.x <- Mathf.Sin(Time.time) newpos.y <- Mathf.Cos(Time.time) this.transform.position <- newpos
рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореВрд▓ рд░реВрдк рд╕реЗ рдореЗрд░реЗ рд╕рдВрдкрд╛рджрдХ - рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рдереАред рдпрд╣ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдФрд░ рдирд╛рдорд╕реНрдерд╛рди рдХреЗ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдХреЗрдд рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг рд╣реИ (рдореИрдВ рдиреАрдЪреЗ рдЗрд╕рдХреА рднреВрдорд┐рдХрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЪрд░реНрдЪрд╛ рдХрд░реВрдВрдЧрд╛), рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдмрджрд▓ рджрд┐рдпрд╛ред
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддреЗ рд╣реИрдВ:

рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЕрд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╕рдордп рдореЗрд░рд╛ рдпрд╣реА рдорддрд▓рдм рд╣реИ - рдЖрдкрдХреЛ рдпрд╛ рддреЛ рдХрдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдиреА рд╣реЛрдВрдЧреА рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрдЧрд╣реЛрдВ рдкрд░ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ (рдХрдо рд╕реЗ рдХрдо рдХрд┐рд╕реА рддрд░рд╣ рдХреА рджреГрд╢реНрдпрддрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП) рдпрд╛ рдХрд┐рд╕реА рд▓рдВрдмреА рд╕реВрдЪреА рдореЗрдВ рдХреБрдЫ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдврд╝реЗрдЧреАред
рдЪреВрдБрдХрд┐ рдЪреМрдХрд╕ рдЧреБрдордирд╛рдо рд╣реИрдмреНрд░реЛрд╕рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдиреЛрдЯрд┐рд╕ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рдмреИрд╕рд╛рдЦреА рдереАрдВ - рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдмрдЧрд▓ рдореЗрдВ FSharp.Core.dll рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбрд╛рд▓рдиреА рд╣реЛрдЧреА, рдореБрдЭреЗ рд╣рд░ рдЬрдЧрд╣ рдлреЗрдВрдХрдирд╛ рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдмрд┐рдирд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдлреЗрдВрдХреЗ рдЬрд╛ рд░рд╣реЗ System.ypeLoadException рдЕрдкрд╡рд╛рдж рдХреЗ рдмрд┐рдирд╛ред
рдФрд░ рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рди рдХреЗрд╡рд▓ FSharp.Core.dll, рд▓реЗрдХрд┐рди рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ, рд╕рдВрдШрд░реНрд╖ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдПрдХрддрд╛ рд╕рдВрдХрд▓рдХ рдЕрдкрдиреЗ рджрдо рдкрд░ рд╣рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ ред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдл # рд╡рд╛рд▓рд╛ рдЦреЗрд▓ рдореЛрдордмрддреНрддреА рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕ рдкрд░ рдпреВрдирд┐рдЯреА 3 рдбреА рдХреЗ рддрд╣рдд рдХреБрдЫ рд▓рд┐рдЦрдирд╛ рдХреЗрд╡рд▓ рдкрд╢реБ рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рд╕реЗ рдмрд╛рд╣рд░ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ, рдФрд░ рдлрд┐рд░ рднреА рдмрд╣реБрдд рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдирд╣реАрдВред
рдпрд╣рд╛рдВ рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдПрдХ рд╕рдВрдкрд╛рджрдХ-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рд╕рднреА рдПрдл # рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдПрдХ рдвреЗрд░ рдореЗрдВ рд░рдЦ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реАрдзреЗ рд╕рдВрдХрд▓рдХ рдХреЛ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрдпреЛрдЧ рд╕реЗ, рд╡рд░реНрдгрд┐рдд рдШрдЯрдирд╛рдУрдВ рд╕реЗ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ, рд╡рд┐рд╢рд╛рд▓ рдХреЗ рд╡рд┐рд╢рд╛рд▓ рд╡рд┐рд╕реНрддрд╛рд░ рдкрд░ рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рдорд┐рд▓рд╛, рдЬреЛ рдореЗрд░реЗ рд╢реЛрдз рдореЗрдВ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдмрди рдЧрдпрд╛ред
рдЕрдЧрд▓реЗ рднрд╛рдЧ рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ, рдореИрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЬрдВрдЧрд▓ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рддрдХ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛, рдЕрдЧрд░ рджреЛ рдмреАрдпреВрдЯреА рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ:
1. System.CodeDom.Compiler.CodeDomProvider рд╡рд░реНрдЧ F # рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
2. System.CodeDom.Compiler рдиреЗрдорд╕реНрдкреЗрд╕ рд╕реЗ рд╕рднреА рдХрдХреНрд╖рд╛рдПрдВ рдХреЗрд╡рд▓ рдпреВрдирд┐рдЯреА рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП "рдЕрджреГрд╢реНрдп" рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреЛрдИ рд▓рд┐рдВрдХ рд╣реИ рдФрд░ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИ, рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗрд╡рд▓ рдПрдХ рдмрдбрд╝рд╛ рдФрд░ рдореЛрдЯрд╛ рд▓реЙрдЧ рджрд┐рдЦрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдмрддрд╛рдПрдЧрд╛ рдФрд░ рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ System.CodeDom.Compiler рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдкрдирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рдХрд┐рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ System.CodeDom.Compiler рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИ, рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдкрд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реЛрдЧрд╛ - рд▓реЙрдЧ рдореЗрдВ рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рд╕рдВрджреЗрд╢ рдорд┐рд▓реЗрдЧрд╛:
Internal compiler error. See the console log for more information. output was:
Unhandled Exception: System.TypeLoadException: Could not load type 'System.CodeDom.Compiler.CompilerResults' from assembly 'System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
рдпрд╣ рдХрд╣рд╛рдиреА рдХрд╛ рдЕрдВрдд рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рдПрдХ рдмрд╛рдд рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ: рдЗрд╕ рдирд╛рдо рд╕реНрдерд╛рди рд╕реЗ рдХрдХреНрд╖рд╛рдПрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд╛рд▓реВ рдбреЛрдореЗрди рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдЕрд╕реЗрдВрдмрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЫрдВрдЯрдиреА рдХрд░рдХреЗ рд▓реЙрдЧ рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдФрд░ рд╡рд┐рдзрд┐ рдХреЙрд▓ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░рддрд┐рдмрд┐рдВрдм рдмрд╛рдж рдореЗрдВ рдорд░рд╣рдо рдореЗрдВ рдПрдХ рдордХреНрдЦреА рдлреЗрдВрдХрддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХрд╣рд╛рдВ, рд▓реЗрдХрд┐рди рдиреАрдЪреЗ)ред
рднрд╛рдЧ рджреЛ
рдж рдЯреИрдорд┐рдВрдЧ рдСрдл рдж рд╢реВрд░реВ
рд╣рдо F # рдХреЗ рд▓рд┐рдП CodeDomProvider рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рджреВрд╕рд░реЗ "BUT" рдХреЛ рдЕрднреА рднреА рджрд░рдХрд┐рдирд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдкрд╣рд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
рдпрд╣ рдпрд╣рд╛рдБ рдХрд╛рдо рдЖрдпрд╛ рдПрдл # рдкреЙрд╡рд░ рдкреИрдХ рдЬреЛ рдХрд┐ рдЧреЛрдЧреНрд▓рд┐рдВрдЧ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬреЛ рдПрдл # рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдЗрд╕ рдХрджрдо рдореЗрдВ CodeDomProvider.CreateProvider рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди ErrorsException рдлреЗрдВрдХрдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрдм рддрд░реНрдХ (рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ) "FSharp" рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕реА рддрд░рд╣ рдХреИрд╕реЗ CodeDomProider C # - рддрд░реНрдХ "CSharp" рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдФрд░ "F #" (рд╢рд╛рдпрдж рдпрд╣ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░реНрдЪреА рдЬрд╛рдПрдЧрд╛)ред
F # рдкреЙрд╡рд░ рдкреИрдХ рдФрд░ рдкреНрд░рддрд┐рд╖реНрдард┐рдд Microsoft.FSharp.Compiler.CodeDom.FSharpCodeProvider рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ System.CadDom.Compiler рдирд╛рдо рд╕реНрдерд╛рди рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп CodeDomProvider рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд▓рдЧрднрдЧ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд╛рдорд▓рд╛ рдЫреЛрдЯрд╛ рд╣реИ - рдкреНрд▓рдЧ рдФрд░ рдкреНрд▓реЗ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рднреА рдиреБрдХрд╕рд╛рди рд╣реИрдВ:
1. рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА .Net рдлреНрд░реЗрдорд╡рд░реНрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
2. FSharpCodeProvider рд╕реНрд╡рдпрдВ System.CodeDom.Compiler рд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рддрдХ рдкрд╣реБрдБрдЪрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЖрдк рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдПрдХ рд╕рддрдд System.TypeLoadException рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕реНрдЯреВрдбрд┐рдпреЛ IntelliSense рдирд╛рдХ рд╕реЗ рднреА рдиреЗрддреГрддреНрд╡ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
Xaos рдХреА рдЗрдЪреНрдЫрд╛ рд╕реЗ, рдореИрдВрдиреЗ рдмрд╕ рдпрд╣реА рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд░рд┐рдлреНрд▓реЗрдХреНрд╢рди рдФрд░ рдПрдХреНрдЯрд┐рд╡реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдм рдХреБрдЫ рдХрд┐рдпрд╛ред рд╢рд╛рдпрдж, рдЖрдЦрд┐рд░рдХрд╛рд░, рдореИрдВрдиреЗ рдХрд╣реАрдВ рдЧрд▓рддреА рдХреА, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдмрджрд▓рдиреЗ рдореЗрдВ рдмрд╣реБрдд рджреЗрд░ рд╣реЛ рдЪреБрдХреА рд╣реИред рдпрд╣ рднреА рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдерд╛ (рдЙрд╕реА рдПрдл # рдХреЗ рд▓рд┐рдП), рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд▓рд╛рдпрд╛, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ (рдЕрд░реНрдерд╛рдд, рд░рд┐рдлреНрд▓реЗрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП FSharpCodeProvider рдореЗрдВ рдХреЛрдИ рд╡рд┐рдзрд┐рдпрд╛рдБ рдирд╣реАрдВ рдереАрдВ), рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рд╕рдм рдХреБрдЫ рдерд╛ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкреАрдбрд╝рд┐рдд System.CodeDom.Compiler рдирд╛рдо рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рд╡рд╣реА рд╕рдорд╕реНрдпрд╛рдПрдВ, рдЬреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ (рдлрд┐рд░ рд╕реЗ) рд╣рд▓ рдХреА рдЧрдИ рдереАрдВред рдХреЛрдИ рднреА рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рдпрд╣рд╛рдБ рдПрдХ рдЫреЛрдЯреЗ рдкреЗрд╕реНрдЯ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ред
рд▓реЗрдЦрдХ рдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ F # рдореЗрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛?рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдПрдл # рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдЬрд╛ рд░рд╣рд╛ рдерд╛ рди рдХреЗрд╡рд▓ рдХреЛрдб рдЬреЛ рд╕рдм рдХреБрдЫ рд╕рдВрдХрд▓рд┐рдд рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рдВрдкрд╛рджрдХ рд▓рд┐рдкрд┐рдпреЛрдВ рдХрд╛ рдХреЛрдб рднреАред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╡рд░рдг рд╕рд╛рдордиреЗ рдЖрдпрд╛ - F # рдкрд░ рд╕рдВрдкрд╛рджрдХ рд╡рд░реНрдЧ рдпреВрдирд┐рдЯреА 3 рдбреА рд╕рдВрдкрд╛рджрдХ рдХреЛ рдмрд┐рдирд╛ рд╢рд░реНрдд рдкреАрдЯрдХрд░ рднреЗрдЬреЗрдВред рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢, рдХреЛрдИ рдкреЙрдк-рдЕрдк, рдХреГрдкрдпрд╛
рддреНрд░реБрдЯрд┐ рдбреЗрдЯрд╛ (рдЖрдкрдХреА рд╕рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдФрд░ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде) рдЗрдВрдЬрди рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕, рдпрд╛ рдЭреВрд▓рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛, рдпрд╛ рдореИрд╕реЗрдЬрдмреЙрдХреНрд╕
рдХреЛ рднреЗрдЬрдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред рдХреБрдЫ рдирд╣реАрдВ! рдЦрд╛рд▓реАрдкрдиред рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЖрдорддреМрд░ рдкрд░
рд╕реНрдЯреИрдгреНрдб рдУрд╡рд░рдлреНрд▓реЛ рдпрд╛ рдХреБрдЫ
рдЕрдирд╡рд╛рдВрдЯреЗрдб рд▓рд╛рдЗрдмреНрд░реЗрд░рд┐рдпреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рджреМрд░рд╛рди рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдкрддрд╛
рдУрд▓рд┐рдпрдбрдмрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди, рдЕрдлрд╕реЛрд╕, рдореБрдЭреЗ рдЕрдм рдЗрд╕реЗ рдХрдо рд╕реЗ рдХрдо рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдХрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреЗрд╡рд▓ (!) рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред рдЧрд┐рд░рд╛рд╡рдЯ рдХреЗ рдХрд╛рд░рдг рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЖрд▓рд╕реНрдп рдерд╛ред
рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рдХреЗ рд▓рд┐рдП, рдореИрдВ F # рдореЗрдВ рд╕рдВрдкрд╛рджрдХ рд╡рд░реНрдЧ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ
рдкреЗрд╕реНрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реВрдВред
рдЪреЗрддрд╛рд╡рдиреА! рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдВрдХрд▓рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛, рдЬрд╣рд╛рдВ рд╕реЗ рдЗрд╕реЗ рдорд┐рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЖрдкрдХреЛ рдПрдХ рдирд┐рд░рдВрддрд░ "рдмрдВрдж" рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рдШреБрдорд╛рд╡рджрд╛рд░ рд╕рдВрдкрд╛рджрдХ рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░рдг рд╕рдВрдкрд╛рджрдХ рджреБрд░реНрдШрдЯрдирд╛ рдХреЗ рдХрд╛рд░рдг) рдЬрдм рд╕рдВрдкрд╛рджрдХ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред рдЖрдкрдХреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рд╕рдмрд╕реЗ рдмреБрд░реЗ
рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ ред рдореИрдВрдиреЗ рдЪреЗрддрд╛рд╡рдиреА рджреАред
рд╣рдорд╛рд░реЗ рдХреЛрдбрдбреЛрдордкреНрд░реЙрдЗрдбрд░ рдкрд░ рд▓реМрдЯрддреЗ рд╣реБрдП, рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдмрд╣реБрдд рдХреБрдЫ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдорд░рд╣рдо рдореЗрдВ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдордХреНрдЦреА рд╣реИ - рдЬрдм рдореИрдВ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ (!) System.CodeDom.Compiler.CompilerParameters рдЙрддреНрдкреНрд░реЗрд░рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореБрдЭреЗ рдПрдХ NotSupportedException рдорд┐рд▓рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ " рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд╡рд╣ MarsBBRROObject рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ ", рдЬреЛ рдХрд╛рдлреА рд╣реИред рдЙрджрд╛рд╕, рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЕрднреА рднреА рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╣реБрдд рд╣реА рд╢рд┐рд╖реНрдЯрддрд╛ рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдЖрдкрдХреЛ рд╡рд░реНрддрдорд╛рди рдбреЛрдореЗрди рдореЗрдВ рдЕрд╕реЗрдВрдмрд▓реА рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ System.dll рдвреВрдВрдврдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╣рдореЗрдВ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╕реЗ рдЪрд╛рд╣рд┐рдП:
IEnumerator asmEnum = System.AppDomain.CurrentDomain.GetAssemblies().GetEnumerator(); while (asmEnum.MoveNext()) { Assembly asm = asmEnum.Current as Assembly; if (asm.FullName.Contains("System, V")) { comparamtype = asm.GetType("System.CodeDom.Compiler.CompilerParameters"); } if (asm.FullName.Contains("FSharp.Compiler.CodeDom")) { compilertype = asm.GetType("Microsoft.FSharp.Compiler.CodeDom.FSharpCodeProvider"); } }
рд▓реЗрдХрд┐рди CompilerParameters рдФрд░ FSharpCodeProvider рджреЛрдиреЛрдВ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ:
object _params = System.Activator.CreateInstance(comparamtype, new object[] { new string[] { "System", "System.Core", UenginePath } }); comparamtype.GetProperty("IncludeDebugInformation").SetValue(_params, true, new object[] { }); comparamtype.GetProperty("OutputAssembly").SetValue(_params, @"Assets/Assembly/Assebly-FSharp-vs.dll", new object[] { }); object compiler = System.Activator.CreateInstance(compilertype);
рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реВрдЪрдирд╛рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рдЖрдк рдПрд╕реЗрдЯ рдкреИрдХреНрд╕ (рддрдерд╛рдХрдерд┐рдд рдПрд╕реЗрдЯрдмрдВрдбрд▓) рд╕реЗ рд╕реА # рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдмрдВрдбрд▓ рдореЗрдВ рд╕рднреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ TextAssets рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИрдВред рдЗрд╕ рддрдереНрдп рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЛрдбрдбреЛрдордкреНрд░реЛрдЗрдбрд░ рдХреА рдорджрдж рд╕реЗ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░рдкреНрд░реЗрдорд░реНрд╕ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗрд╡рд▓ рддреАрди рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (рд╣рд╛рдБ, рдпрд╣ рдПрдХ рдЛрдг рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛)ред рд╕рд░рдгреА рдХрд╛ рддреАрд╕рд░рд╛ рд╕рджрд╕реНрдп рдПрдХ рдРрд╕реА рд╕рдВрдкрддреНрддрд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ рдпреВрдирд┐рдЯреАрдЬрд╛рдЗрди.рдбреЙрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдкрде рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
static string UenginePath { get { return UnityEditor.EditorApplication.applicationContentsPath + "/Managed/UnityEngine.dll"; } }
рдЫреЛрдЯреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдлрд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╕рдВрдХрд▓рдХ рдХреЛ рднреЗрдЬреЗрдВред рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдБ рдПрдХ рдФрд░ рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдВ рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛:

"рдХреБрдЫ рдпрд╣рд╛рдБ рдЧрд▓рдд рд╣реИ," рд╕реНрдЯрд░реНрд▓рд┐рдЯреНрдЬрд╝ рдиреЗ рд╕реЛрдЪрд╛ред рдФрд░ рдореИрдВрдиреЗ рд╕рд╣реА рд╕реЛрдЪрд╛ - рдореИрдВрдиреЗ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдПрдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рджрд┐рдЦрд╛рдпрд╛ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░рд┐рдгрд╛рдореА рд╕рдВрдкрд╛рджрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдФрд░ рди рд╣реА рдореИрдВ рдЕрдкрдиреЗ рд╕реЗ рдЖрдЧреЗ рдирд┐рдХрд▓рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдРрд╕рд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рддрд╛рдХрд┐ рдЖрдЧреЗ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпреЛрдВ рдХрд╛ рд╕рд╛рд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛред рдФрд░ рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ: рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдм рдЖрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддрддреНрд╡ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдШреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ <=> рд╕рдВрдкрддреНрддрд┐, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдЕрдЧрд░ рдпрд╣ рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ AssetDatabase рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, "рдпрд╣ рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ! = рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдЖрдпрд╛рддрд┐рдд рдлрд╝реЛрд▓реНрдбрд░ред" рд▓реЗрдХрд┐рди рдЙрд╕ рдкрд░ рдФрд░ рдмрд╛рдж рдореЗрдВред рдЗрд╕ рдЪрд░рдг рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рд╡рд╣ рдкрд╣рд▓реЗ рд╣реА рд╣реЛ рдЪреБрдХрд╛ рд╣реИ - рд╣рдо рд╕рдВрдХрд▓рдХ рдФрд░ рдЙрд╕рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛ рдЧрдП рд╣реИрдВред
рдЖрдЗрдХрдиреЛрдВ рдХреА рдмрд╛рдд рд╣реЛ рд░рд╣реА рд╣реИрдпрд╣ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдл # рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдЗрдХрди рд╣рдореЗрд╢рд╛ рдореЗрд░рд╛ рдЬреИрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдХреНрдпреЛрдВ?
EditorGUIUtility.ObjectContent рдореЗрдердб (рдЬрд┐рд╕реЗ UnityEditor.DoObjectField Method рдХреЗ рдЕрдВрджрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдкрд░ рдорджрдж рд╕реЗ, рдпрд╛ рдЗрд╕рдХреЗ рдУрд╡рд░рд▓реЛрдб рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдмрдЬрд╛рдп, рдЬреЛ рд╡рд░реНрддрдорд╛рди Event.Current.type рдХреЗ рдорд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╡рд┐рдВрдбреЛ рдЦреАрдВрдЪрддрд╛ рд╣реИ, рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдкрд╛рджрдХ рдкрд╣рд▓реЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдХреИрд╢ рдореЗрдВ рдЖрдЗрдХрди, рдлрд┐рд░ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдЖрдЗрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдпрджрд┐ рдХреЛрдИ рдЙрдкрдпреБрдХреНрдд рдЖрдЗрдХрди рдирд╣реАрдВ рдорд┐рд▓рд╛ рддреЛ DefaultAsset рдЖрдЗрдХрди рдЕрд╕рд╛рдЗрди рдХрд░рддрд╛ рд╣реИред
рднрд╛рдЧ рддреАрди
рд╕реНрдкреИрд░реЛ рддреЛрдк рд╕реЗред рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдФрд░ рд╢рд░рд╛рд░рддреА рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░
рд╕рд╛рдорд╛рдиреНрдп рдбреНрд░реИрдЧ рдФрд░ рдбреНрд░реЙрдк рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдШрдЯрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рд▓реЗрдХрд┐рди рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ рдкреВрд░реА рд╕рдЪреНрдЪрд╛рдИ рдирд╣реАрдВ рдмрддрд╛рдИ - рд╕рдВрдкрд╛рджрдХ рдиреЗ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрд╛ рдХрд┐ рд╡рд╣ рдЬреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдЕрднреА рднреА рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИред рдЧреИрд░-рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рд╕рдВрдкрддреНрддрд┐рдпрд╛рдБ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓, рдЬреИрд╕реЗ рд╣рдорд╛рд░реА .fs рд╕реНрдХреНрд░рд┐рдкреНрдЯ) рдХреЛ UnityEngine.DefaultAsset (рдЬреЛ, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдЖрдВрддрд░рд┐рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдВрдкрд╛рджрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрдВ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИ (рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рдПрд╕реЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реАрдзреЗ рдЙрд╕рдХреЗ рд╕реНрдерд╛рди рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛) (рдпрд╣ рд╕рд┐рд░реНрдл рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рдореБрдЭреЗ, рдкреНрд░рддрд┐рд░реВрдк рд╕реЗ рдмреЛрд▓рдирд╛ рдерд╛, рдПрдХ рдмреИрд░рд▓ рдмрдирд╛рдирд╛ :
string[] _files = Directory.GetFiles("Assets/", "*.fs"); typenameToObject = new Dictionary<string, UnityEngine.Object>(); foreach (string file in _files) { UnityEngine.Object o = AssetDatabase.LoadAssetAtPath(file, typeof(UnityEngine.Object)); if (CollectCompileDeploy.typenameToObject != null) { CollectCompileDeploy.typenameToObject.Add(o.name, o); } else { return; } }
рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рд░рд╛рд╕реНрддреЛрдВ рдХреА рд╕реВрдЪреА рд╕реЗ .fs рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдореБрдЭреЗ рдЙрди рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИ рдЬрд┐рдирдХреЗ рддрд╣рдд рдЙрдиреНрд╣реЗрдВ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдРрд╕реА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ F # рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП CustomInstector рдмрдирд╛рддреЗ рд╕рдордп рд╕реНрд╡рдпрдВ рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИ, рдЕрд░реНрдерд╛рддреН: UnityEngine.DefaultAsset рдХреЛ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдпрд╛ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЙрдирдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреНрдп рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА AssetDatabase рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣рд╛рдВ рдЙрдиреНрд╣реЗрдВ Directory.GetFiles рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
F # рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдПрдХ рд╢реБрджреНрдз рдХреЙрд╕реНрдореЗрдЯрд┐рдХ рдЖрд╡рд╛рд░рд╛ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╕рдВрдкрд╛рджрдХ рд▓рд┐рдкрд┐ рдореЗрдВ UnityEngine.DefaultAsset рдкреНрд░рдХрд╛рд░ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ UnityEngine.Object рдХреЗ рд▓рд┐рдП рдПрдХ CustomEditor рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдпрд╣ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ UnityEngine.Object рдПрдХ .fs рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдФрд░ рдирд╣реАрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ prefab рдпрд╛ рдмрдирд╛рд╡рдЯ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдкрдврд╝реА рдЬрд╛рддреА рд╣реИред рдХреЛрдб рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЬреЛ, рд╡реИрд╕реЗ, рдЪрдпрдирд┐рдд рдФрд░ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд╣реЗрдЬрд╛ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛)ред
рдЗрд╕ CustomInspector рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:
[CustomEditor(typeof(UnityEngine.Object))] public class FSharpScriptInspector : Editor { public SerializedProperty test; string text; void OnEnable() { Repaint(); } public override void OnInspectorGUI() { GUI.enabled = true; if (!AssetDatabase.GetAssetPath(Selection.activeObject).EndsWith(".fs")) { DrawDefaultInspector(); } else { if (text == null) { StreamReader sr = File.OpenText(AssetDatabase.GetAssetPath(Selection.activeObject)); text = sr.ReadToEnd(); sr.Close(); } GUILayout.Label("Imported F# script"); EditorGUILayout.TextArea(text); } } }
рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ CustomEditor рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо CustomInspector рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдХреНрдпреЛрдВрдХрд┐ рдпреВрдирд┐рдЯреА 3 рдбреА рдкреНрд░рдХрд╛рд░ рдХреЗ рднрд╛рд░реА рдмрд╣реБрдордд рдХреЛ рдпреВрдирд┐рдЯреА рдПрдВрдЬреАрди рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдзрд╛рд░ (рд╕рдВрдкрддреНрддрд┐ рд╕рд╣рд┐рдд), рддреЛ рдпрд╣ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдХрд┐ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдХреЗрд╡рд▓ .fs рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЖрд╣рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рднреА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдВрдкрддреНрддрд┐ рдХреЛ AssetDatabase.GetAssetPath рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред рдбреНрд░рд╛рдбрд┐рдлреЙрд▓реНрдЯ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рд╡рд┐рдзрд┐ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рдирд┐рд░реАрдХреНрд╖рдХ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред
рдЗрд╕ рдбреА рдПрдВрдб рдбреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдЕрдВрддрд┐рдо рдХреЛ рд╣рдореЗрд╢рд╛ Event.current рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЬреЛ рд╣рдореЗрд╢рд╛ рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рдбреНрд░реЙ рдФрд░ рдбреНрд░реЙрдк рдЗрд╡реЗрдВрдЯреНрд╕ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдХреЗрд╡рд▓ рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ CustomInspector рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рд╡рд┐рдВрдбреЛ рдкрд░ рдЗрди рдбреА рдПрдВрдб рдбреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХреЗред рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:
1. UnityEngine.GameObject рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП CustomInspector рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
2. UnityEngine.Transform рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП CustomInspector рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЯрд┐рдкреНрдкрдгреАUnityEngine.Transform рд╡рд╕реНрддреБ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ - рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐, рд░реЛрдЯреЗрд╢рди, рд╕реНрдХреЗрд▓ред рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрдкрд╡рд╛рдж рдХреЗ,
рдЧреЗрдордмрдЬреЗрдХреНрдЯреНрд╕ рдкрд░ рд╕реНрдерд┐рдд рд╣реИ
ред
рджреВрд╕рд░рд╛ рдмреЗрд╣рддрд░ рд╣реИред рдФрд░ рджрд╛рдИрдВ рдУрд░ рдХреА рддрд╕реНрд╡реАрд░ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдХреНрдпреЛрдВред
рдпрд╣рд╛рдВ рдбреНрд░рд╛рдбрд┐рдлреЙрд▓реНрдЯ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдереЛрдбрд╝рд╛ рд╕рд┐рд░рджрд░реНрдж рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдореБрдЭреЗ рдХреЗрд╡рд▓ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рд▓реЗрдХрд┐рди рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ CustomInspector рдХреЛ рдХреБрдЫ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП! рдпрд╛ рдбреНрд░рд╛рдбрдлреЙрд▓реНрдЯ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдХреЛ рдмреБрд▓рд╛рдУ, рд▓реЗрдХрд┐рди рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд╣реБрдЖред
рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рдЦреЛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЦрд┐рдбрд╝рдХреА рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдпрд╣ рд╡реЗрдХреНрдЯрд░ 3 рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рддреАрди рдлрд╝реАрд▓реНрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
1. рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ Euler рдХреЛрдг рдХреЗ рд░реВрдк рдореЗрдВ рдШреБрдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП
2. рд╡рд╕реНрддреБ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП
3. рд╡рд╕реНрддреБ рдХреЗ рдкреИрдорд╛рдиреЗ рдХреЗ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП
рдПрд╡реЗрд░рд┐рдпрди рдореВрд▓реНрдп рд╕реЗ рдЪрддреБрд░реНрднреБрдЬ рддрдХ рдХреЗ рдХреЛрдг рдХрд╛ рдорд╛рди Quaternion.Euler рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╡рд╛рджрд┐рдд рд╣реИред
рдЗрд╕ CustomInspector рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:
using UnityEngine; using System.Collections; using UnityEditor; using System.IO; using System.Collections.Generic; [CustomEditor(typeof(UnityEngine.Transform))] public class ComponentCI : Editor { Vector3 position; void OnEnable() { Repaint(); } public override void OnInspectorGUI() { EditorGUILayout.BeginVertical(); (this.target as Transform).localRotation = Quaternion.Euler(EditorGUILayout.Vector3Field("Local Rotation", (this.target as Transform).localRotation.eulerAngles)); (this.target as Transform).localPosition = EditorGUILayout.Vector3Field("Local Position", (this.target as Transform).localPosition); (this.target as Transform).localScale = EditorGUILayout.Vector3Field("Local Scale", (this.target as Transform).localScale); EditorGUILayout.EndVertical(); if (Event.current.type == EventType.DragPerform) { if (AssetDatabase.GetAssetPath(DragAndDrop.objectReferences[0]).EndsWith(".fs")) { (this.target as Transform).gameObject.AddComponent(DragAndDrop.objectReferences[0].name); } } } }
UnityEngine.GameObject рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?рдФрд░ рдпрджрд┐ рдЖрдк UnityEngine.GameObject рдХреЛ рд▓рдХреНрд╖реНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рдЧрдбрд╝рдмрдбрд╝ рд╣реИ - рдХреЙрдореНрдмреЛ рдмреЙрдХреНрд╕ рдирд┐рдпрдорд┐рдд рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рд▓реЗрдпрд░ рдорд╛рд╕реНрдХ рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрдЬ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ (рдХреЙрдореНрдмреЛ рдмреЙрдХреНрд╕ рдХреЗ рдмрдЬрд╛рдп рдЪреЗрдХрдмреЙрдХреНрд╕ рдХреЗ рдЕрдВрджрд░)
рдХреЛрдб рдкрд░ рдПрдХ рдХрд░реАрдмреА рдирдЬрд╝рд░ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рджрд┐рдЦрд╛рддреА рд╣реИ - рдбреНрд░реЙрдк рдЗрд╡реЗрдВрдЯ рдХреЗ рджреМрд░рд╛рди рдХреМрди рд╕рд╛ рдШрдЯрдХ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ?
GameObject.AddComponent рдХреЗ рдУрд╡рд░рд▓реЛрдб рдореЗрдВ рд╕реЗ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд╛рдо рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо рд╣реИ, рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдирд╛рдорд╕реНрдерд╛рди рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдерд┐рдд рд╣реИ, рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИред
рдирд╛рдо рд╕реНрдерд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХрдЬреИрд╕рд╛ рдХрд┐ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдирд╛рдо рд╕реНрдерд╛рди рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреА рд╕рднреА рдЙрдерд▓-рдкреБрдерд▓ рдкрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг:
рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдирд╛рдорд╕реНрдерд╛рди рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ (рдХрдо рд╕реЗ рдХрдо рд╕реА # рдХреЗ рд▓рд┐рдП) рдЕрдм рдЕрд╕рдВрднрд╡ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕реНрддрд░ рдкрд░ рднреА рдПрдл # рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рд╡рд░рдг рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛: рдирд╛рдо рд╕реНрдерд╛рди рдФрд░ рд╡рд░реНрдЧ рдХрд╛ рдирд╛рдо рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╛рдиреА рддреНрд░реБрдЯрд┐ рдЬреЛ
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рд╡рд░реНрдЧ рдХреЗ рдирд╛рдо рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреА рд╣реИ, F # рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рднреА Unity3D рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИред рдЖрдк рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрдИ рд╡рд░реНрдЧ - рдореЛрдиреЛрдмреЗрд╣реМрд░ рдХреЗ рд╡рдВрд╢рдЬ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдБ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╣реИ - рд╡реЗ
рдХреЗрд╡рд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗ (рдпрджрд┐ рдЖрдк рдЬреИрд╕рд╛ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рдерд╛)ред рдЙрд╕реА рд╕рдордп, рдЖрдк рдиреЗрдорд╕реНрдкреЗрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рджреВрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ - рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдирд╛рдорд╕реНрдерд╛рди рдпрд╛ рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЕрдиреБрдкрд╛рд▓рди рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╢рд╛рдВрддрд┐ рд╕реЗ рддреНрд░реБрдЯрд┐
FS0222 рдлреЗрдВрдХрддрд╛ рд╣реИред
рдЕрдм рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдбреА рдПрдВрдб рдбреА рддреИрдпрд╛рд░ рд╣реИред рдХреЗрд╡рд▓ рдЕрдм рдпрд╣ рдмрд╣реБрдд рд╕реБрдВрджрд░ рдирд╣реАрдВ рд▓рдЧреЗрдЧрд╛ред рдирд┐рд░реАрдХреНрд╖рдХ рд╡рд┐рдВрдбреЛ рдХреЛ рдЗрд╕ рддрд░рд╣ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдкреНрд░рддреНрдпреЗрдХ F # рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ CustomInspector рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдХреЛрдб (рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ SphereMoving рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ):
(VisualStudio autoformatting рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдб рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕реНрд╡рд░реВрдкрдг рдФрд░ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЧрдгрдирд╛ рдирд╣реАрдВ рдХреА рдЧрдИ рдереА рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЗрд╕ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкрдврд╝реЗрдЧрд╛)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEngine; using UnityEditor; using System.IO; [CustomEditor(typeof(Assembly_FSharp_vs.SphereMoving))] [CanEditMultipleObjects] public class ins_SphereMoving : Editor { public SerializedProperty prop1; public List<SerializedProperty> props; void OnEnable() { props = new List<SerializedProperty>(); System.Reflection.FieldInfo[] fields = typeof(Assembly_FSharp_vs.SphereMoving).GetFields(); foreach (System.Reflection.FieldInfo field in fields) { SerializedProperty mp = serializedObject.FindProperty(field.Name); if (mp != null) { props.Add(mp); } } Repaint(); } public override void OnInspectorGUI() { if (UnityEditor.EditorApplication.isCompiling) { EditorGUILayout.LabelField("Can't show anything during compilation");
рдЬрдм рдореИрдВрдиреЗ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ рдореИрдВрдиреЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рджрд┐рдпрд╛ - рдпреВрдирд┐рдЯреА 3 рдбреА рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдХреНрд▓рд╛рд╕реЗрд╕ рдиреЗ рд╕реЗрд░рд┐рдЕрд▓рд╛рдЗрдЬрд╝реНрдбрдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рд╕реЗрд░реАрд▓рд╛рдЗрдЬрд╝реНрдбрдкреНрд░реЙрдкрд░реНрдЯреА рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рд╡рд┐рдВрдбреЛ рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдорд╛рдиреЛрдВ рдХреЛ рдмрдЪрд╛рдпрд╛ рдФрд░ рдЦреБрдж рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдорджрдж рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдЗрди рд╕рдорд╛рди SerializedProperty рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рдЗрд╕ рдбрд┐рдЬрд╛рдЗрди рдХрд╛ рд╕рд╣реА рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдореБрдЭреЗ рдРрд╕реА рдЧрдбрд╝рдмрдбрд╝ рдорд┐рд▓реА:
рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдпрд╣ рдмрджрддрд░ рд╣реБрдЖред
рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдХреНрдпрд╛ рдЧрд▓рдд рдХрд┐рдпрд╛ рд╣реИ? рд▓реЗрдХрд┐рди рдХреБрддреНрддрд╛ рдЙрд╕реЗ рдЬрд╛рдирддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП - рдлрд┐рд░ рд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдФрд░ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдЗрд╕рдХреЗ рдмрд╛рдж SerializedObject.FindProperty рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ SerializedProperty рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред CanEditMultipleObjects рд╡рд┐рд╢реЗрд╖рддрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдПрдХ рд╣реА рд╡рд╕реНрддреБ рдкрд░ рд╕реНрдерд┐рдд рдХрдИ рд╕рдорд╛рди рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд░реАрдХреНрд╖рдХ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХреЗрдВ, рдпрд╣рд╛рдБ рдпрд╣ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рд╛ рд╣реИ рдЬреЛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯрдлрд╝рд┐рд▓реНрдб рд╣реИ, рдФрд░ рдЬрд┐рд╕ рдкрд░ рдЖрдкрдХреЛ UnityEngine.DefaultAsset рдСрдмреНрдЬреЗрдХреНрдЯ рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ рд╣рдорд╛рд░реА рдЖрдпрд╛рддрд┐рдд .fs рдлрд╝рд╛рдЗрд▓ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЬрдм рдЖрдк рдЗрд╕ рдлрд╝реАрд▓реНрдб рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ .fs рдлрд╛рдЗрд▓ рд╣реЛрдЧреА, рдЬрд┐рд╕реЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рди рдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЕрдВрджрд░ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯред
рддреЛ, рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдЗрд╕ рддрд╕реНрд╡реАрд░ рдХреЛ рджреЗрдЦрдХрд░, рдЪреМрдХрд╕ рдкрд╛рдардХ рдпрд╣ рдХрд╣реЗрдЧрд╛: рдореЗрд░реЗ рдмрдЧреАрдЪреЗ рдореЗрдВ рдХреНрдпрд╛ рдЪрдорддреНрдХрд╛рд░ рд╣реИ?
рд╣рд╛рдБ, рдпрд╣ рд╕рдм рдирд╣реАрдВ рд╣реИред
рднрд╛рдЧ рдЪрд╛рд░
рдЖрдЧреЗ - рдФрд░ рдЧрд╣рд░рд╛ред рд╣рдо рдореЗрдиреВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рд╕рдорд╛рдзрд╛рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ

рдЖрдЧреЗ, F # рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ C # / Boo / UnityScript рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдХрд░реАрдм рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдореЗрдиреВ "Asets-> Create" рдФрд░ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдореЗрдВ рдЖрдЗрдЯрдо "F # Script" рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреА рдкреАрдврд╝реА рдФрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдирд┐рд░реНрдгрдп (рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдиреАрдЪреЗ)ред ,
Assets->Create, :
[MenuItem("Assets/Create/F# script")] public static void CreateFS() { string path = AssetDatabase.GetAssetPath(Selection.activeObject); string addNum = ""; if (Selection.activeInstanceID <= 0) { path="Assets"; } if (path.Contains(".")) { path =Directory.GetParent(path).ToString(); } while (File.Exists(path + "/NewBehaviourScript" + addNum.ToString() + ".fs")) { addNum = addNum == "" ? (1).ToString() : (int.Parse(addNum) + 1).ToString(); } path = path + "/NewBehaviourScript" + addNum.ToString() + ".fs"; StreamWriter sw = File.CreateText(path); sw.WriteLine("//Please, don't try to change namespace"); sw.WriteLine("namespace Assembly_FSharp_vs"); sw.WriteLine("type public " + "NewBehaviourScript" + addNum.ToString() + " () ="); sw.WriteLine(" inherit UnityEngine.MonoBehaviour()"); sw.WriteLine(" [<DefaultValue>] val mutable showdown1 : UnityEngine.Vector3"); sw.WriteLine(" [<DefaultValue>] val mutable showdown2 : UnityEngine.Vector3"); sw.WriteLine(" [<DefaultValue>] val mutable showdown3: int"); sw.WriteLine(" member public this.Start () = UnityEngine.Debug.Log(\"initialized\")"); sw.Flush(); sw.Close(); AssetDatabase.LoadAssetAtPath(path,Type.GetType("UnityEngine.DefaultAsset,UnityEngine")); AssetDatabase.Refresh(ImportAssetOptions.ForceSynchronousImport); }
MenuItem , , , , . . ( Selection.activeObject ) , , ( , ) ( , , , . , , Unity3d, ?). , activeInstanceID , , . , activeInstanceID . , , activeInstanceID . , , Assets( ). , , , NewBehaviourScript[\d]*\.fs, , F# , , , :
//Please, don't try to change namespace namespace Assembly_FSharp_vs type public NewBehaviourScript1 () = inherit UnityEngine.MonoBehaviour() [<DefaultValue>] val mutable showdown1 : UnityEngine.Vector3 [<DefaultValue>] val mutable showdown2 : UnityEngine.Vector3 [<DefaultValue>] val mutable showdown3: int member public this.Start () = UnityEngine.Debug.Log("initialized")
тАФ , ! .fs Visual Studio, , , , , IDE (, UnityEngine ). , :
<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <ProductVersion>8.0.30703</ProductVersion> <SchemaVersion>2.0</SchemaVersion> <ProjectGuid>{ACFBFD03-C456-E983-5028-ACC6C3ACEA62}</ProjectGuid> <OutputType>Library</OutputType> <RootNamespace>Assembly_FSharp_vs</RootNamespace> <AssemblyName>Assembly_FSharp_vs</AssemblyName> <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <Name>Assembly-FSharp-vs</Name> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <DebugSymbols>true</DebugSymbols> <DebugType>full</DebugType> <Optimize>false</Optimize> <Tailcalls>false</Tailcalls> <OutputPath>bin\Debug\</OutputPath> <DefineConstants>DEBUG;TRACE</DefineConstants> <WarningLevel>3</WarningLevel> <DocumentationFile>bin\Debug\Assembly_FSharp_vs.XML</DocumentationFile> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <DebugType>pdbonly</DebugType> <Optimize>true</Optimize> <Tailcalls>true</Tailcalls> <OutputPath>bin\Release\</OutputPath> <DefineConstants>TRACE</DefineConstants> <WarningLevel>3</WarningLevel> <DocumentationFile>bin\Release\Assembly_FSharp_vs.XML</DocumentationFile> </PropertyGroup> <ItemGroup> <Reference Include="mscorlib" /> <Reference Include="FSharp.Core" /> <Reference Include="System" /> <Reference Include="System.Core" /> <Reference Include="System.Numerics" /> <Reference Include="D:/Program Files/Unity3.5/Editor/Data/Managed/UnityEngine.dll" /> </ItemGroup> <ItemGroup> <Compile Include="Assets/NewBehaviourScript.fs" /> <Compile Include="Assets/SphereMoving.fs" /> </ItemGroup> <Import Project="$(MSBuildExtensionsPath32)\FSharp\1.0\Microsoft.FSharp.Targets" Condition="!Exists('$(MSBuildBinPath)\Microsoft.Build.Tasks.v4.0.dll')" /> <Import Project="$(MSBuildExtensionsPath32)\..\Microsoft F#\v4.0\Microsoft.FSharp.Targets" Condition=" Exists('$(MSBuildBinPath)\Microsoft.Build.Tasks.v4.0.dll')" /> </Project>
, XML тАФ . Assembly-CSharp-vs.csproj. , , (csproj C# fsproj F#). , тАФ (ReferenceInclude) (CompileInclude). , . .тАж XML, . ProjectGUID. .
UnityEditor.VisualStudioIntegration.SolutionGuidGenerator ( , " SolutionGUIDGenerator Unity3d" ( ) 1 , .
, , ). GUID , . тАФ . , , , ( ) :
Project("ACFBFD03-C456-E983-5028-ACC6C3ACEA62") = ".\FSharp-csharp", "Assembly-FSharp-vs.fsproj", "{9512B9D0-6FAE-8F85-778C-B28C5421520D}" EndProject
тАФ GUID . тАФ GUID .
, ┬лF#->Update soltuion file┬╗.
, :
static string xmlSourceFileDataEnter = "<Compile Include=\""; static string xlmSourceFileDataEnding = "\" />"; [MenuItem("F#/Update solution file")] public static void UpdateSolution() { if(File.Exists("Assembly-FSharp-vs.fsproj")) { File.Delete("Assembly-FSharp-vs.fsproj"); } StreamWriter sw = File.CreateText("Assembly-FSharp-vs.fsproj"); sw.WriteLine(xmlEnterData); foreach (UnityEngine.Object file in typenameToObject.Values) { sw.Write(xmlSourceFileDataEnter); sw.Write(AssetDatabase.GetAssetPath(file)); sw.WriteLine(xlmSourceFileDataEnding); } sw.WriteLine(xmlFinishData); sw.Flush(); sw.Close(); sw.Dispose(); string[] slnfiles = Directory.GetFiles(".","*-csharp.sln"); if (slnfiles != null && slnfiles.Length>0) { StreamReader sr = File.OpenText(slnfiles[0]); List<string> lines = new List<string>(); while (!sr.EndOfStream) { string readenLine = sr.ReadLine(); lines.Add(readenLine); if (readenLine.Contains("Assembly-FSharp-vs.fsproj")) { sr.Close(); sr.Dispose(); return; } } sr.Close(); sr.Dispose(); sw = File.CreateText(slnfiles[0]); List<string>.Enumerator linesEnum = lines.GetEnumerator(); linesEnum.MoveNext(); sw.WriteLine(linesEnum.Current); linesEnum.MoveNext(); sw.WriteLine(linesEnum.Current); string slinname = slnfiles[0].Remove(slnfiles[0].LastIndexOf(".sln")); sw.WriteLine("Project(\"" + UnityEditor.VisualStudioIntegration.SolutionGuidGenerator.GuidForProject("Assembly-FSharp-vs") + "\") = \"" + slinname + "\", \"Assembly-FSharp-vs.fsproj\", \"{"+UnityEditor.VisualStudioIntegration.SolutionGuidGenerator.GuidForSolution(slinname)+"}\""); sw.WriteLine("EndProject"); while (linesEnum.MoveNext()) { sw.WriteLine(linesEnum.Current); } sw.Flush(); sw.Close(); sw.Dispose(); } }
xmlEnterData xmlFinishData , ┬лCompile Include┬╗ .
UnityEngine , GUID . ┬лUpdate solution file┬╗тАж
, ┬лManual rebuild┬╗. , F# , , , . , , , UnityEngine.Object, . , , Unity , , . , , F# .
- , - . ProgressBar':

, ?
UnityEngine.Object . .
, . , , Unity3d . , .
PS ExecuteInEditMode MonoBehaviour ( Monobehaviour.Update ) - , . , Edit-time unity script, C#, ?
Edit-time
, , , . , , InitializeOnLoad ( ). , , , , . CustomInspector' , .
, . , , , - , yield-, . , , - yield- - . , :
public class UniversalEnumerator : IEnumerator { List<Func<object>> allCodeFrames = new List<Func<object>>(); IEnumerator codeEnum; Func<object> finishAction = null; public Func<object> FinishAction { get { return finishAction; } set { finishAction = value; } } public void Add(Func<object> code) { allCodeFrames.Add(code); } public void _Finalize() { codeEnum = allCodeFrames.GetEnumerator(); } public object Current { get { return codeEnum.Current; } } public bool MoveNext() { bool res = codeEnum.MoveNext(); if (res) { (codeEnum.Current as Func<object>)(); } else { if (FinishAction != null) { return FinishAction()!=null; } } return res; } public void Reset() { codeEnum = null; allCodeFrames.Clear(); FinishAction = null; } }
, Add Func . MoveNext _Finalize codeEnum.Current. FinishAction тАФ , , . , False, , ( , , ). UpdateLoop . InitializeOnLoad:
static UniversalEnumerator currentRoutine; static CollectCompileDeploy() { UnityEditor.EditorApplication.update += new EditorApplication.CallbackFunction(() => { if (currentRoutine != null) { if (!currentRoutine.MoveNext()) { currentRoutine = null; } } }); Initialize(); }
Recompile UniversalEnumerator.
public enum CompilationState { GATHER =1, COMPIL, VALIDATION, SOLUTION, DONE, NONE } public static UniversalEnumerator Recompile() { UniversalEnumerator myEnum = new UniversalEnumerator(); _current = CompilationState.GATHER; CompilationProgressWindow.Init(); myEnum.Add(() => { files.Clear(); ReassingTypes(); return null; }); bool exitall = false; myEnum.Add(() => { if (File.Exists("Assets/Assembly/Assembly-FSharp-vs.dll")) { AssetDatabase.DeleteAsset("Assets/Assembly/Assembly-FSharp-vs.dll"); File.Delete("Assets/Assembly/Assembly-FSharp-vs.dll"); } if (files.Count == 0) { Debug.Log("seems like no any F# file here.terminating"); _current = CompilationState.NONE; exitall = true; } return null; }); System.Type comparamtype = null; System.Type compilertype = null; myEnum.Add(() => { if (exitall) { return null; } UniversalEnumerator bufferedRoutine = currentRoutine; UniversalEnumerator nroutine = new UniversalEnumerator(); IEnumerator asmEnum = System.AppDomain.CurrentDomain.GetAssemblies().GetEnumerator(); while (asmEnum.MoveNext()) { Assembly asm = asmEnum.Current as Assembly; nroutine.Add(() => { if (asm.FullName.Contains("System, V")) { comparamtype = asm.GetType("System.CodeDom.Compiler.CompilerParameters"); } if (asm.FullName.Contains("FSharp.Compiler.CodeDom")) { compilertype = asm.GetType("Microsoft.FSharp.Compiler.CodeDom.FSharpCodeProvider"); } return null; }); } nroutine.FinishAction = () => { currentRoutine = bufferedRoutine; return new object(); }; nroutine._Finalize(); currentRoutine = nroutine; return null; }); myEnum.Add(() => { if (exitall) { return null; } UnityEditor.EditorApplication.LockReloadAssemblies(); try { object _params = System.Activator.CreateInstance(comparamtype, new object[] { new string[] { "System", "System.Core", UenginePath } }); comparamtype.GetProperty("IncludeDebugInformation").SetValue(_params, true, new object[] { }); comparamtype.GetProperty("OutputAssembly").SetValue(_params, @"Assets/Assembly/Assebly-FSharp-vs.dll", new object[] { }); object compiler = System.Activator.CreateInstance(compilertype); List<string> __fls = new List<string>(); foreach(UnityEngine.Object asset in typenameToObject.Values) { __fls.Add(AssetDatabase.GetAssetPath(asset)); } _current = CompilationState.COMPIL; object _output = compilertype.GetMethod("CompileAssemblyFromFile").Invoke(compiler, new object[] { _params, __fls.ToArray() }); compiled = _output.GetType().GetProperty("CompiledAssembly").GetValue(_output, new object[] { }) as Assembly; foreach (object message in _output.GetType().GetProperty("Output").GetValue(_output, new object[] { }) as System.Collections.Specialized.StringCollection) { Debug.Log(message); } foreach (object error in (_output.GetType().GetProperty("Errors").GetValue(_output, new object[] { }) as System.Collections.CollectionBase)) { Debug.LogError(error); } if (compiled != null) { _current = CompilationState.VALIDATION; UniversalEnumerator bufferedRoutine = currentRoutine; UniversalEnumerator nroutine = ValidateInspectors(); nroutine.Add(() => { _current = CompilationState.SOLUTION; UpdateSolution(); _current = CompilationState.DONE; CompilationProgressWindow.Remove(); AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate); return null; }); nroutine._Finalize(); nroutine.FinishAction = () => { currentRoutine = bufferedRoutine; return new object(); }; currentRoutine = nroutine; } else { Debug.LogError("compiled assembly is still not visible!"); } } catch { } UnityEditor.EditorApplication.UnlockReloadAssemblies(); return null; }); myEnum._Finalize(); return myEnum; }
.
. :
UniversalEnumerator bufferedRoutine = currentRoutine; UniversalEnumerator nroutine = new UniversalEnumerator(); nroutine.Add(() => {
UniversalEnumerator, currentRoutine UniversalEnumerator, FinishAction. new object() , MoveNext false, FinishAction , , EditorUpdateLoop MoveNext , false, currentRoutine null. - UniversalRoutine, , , .
?:
1. .. Mono,
IsBackground . , .
2. : Thread.Abort Unity3D : -
. тАФ . тАФ (Debug.Log, ) тАж , .. , . , .
, .
enum' CompilationState, . _current:
private static CompilationState __current = CompilationState.NONE; public static CompilationState _current { get { return CollectCompileDeploy.__current; } set { CollectCompileDeploy.__current = value; if (CompilationProgressWindow.me != null) { CompilationProgressWindow.me.Repaint(); } } }
, CompilationProgressWindow тАФ , EditorWindow . Repaint , - , , . тАФ .
:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEditor; using UnityEngine; using System.Runtime.InteropServices; public class CompilationProgressWindow : EditorWindow { public static CompilationProgressWindow me; [StructLayout(LayoutKind.Sequential)] public struct WndRect { public int Left; public int Top; public int Right; public int Bottom; } #if UNITY_EDITOR && UNITY_STANDALONE_WIN [DllImport("user32.dll")] static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll", SetLastError = true)] static extern bool GetWindowRect(IntPtr hWnd, out WndRect rect); public static Vector2 GetWNDSize() { WndRect r = new WndRect(); GetWindowRect(GetForegroundWindow(), out r); return new Vector2(r.Right - r.Left, r.Bottom - r.Top); ; } #else public static Vector2 GetWNDSize() { return Vector2.zero; } #endif public static void Init() { if (me == null) { Vector2 mainWND = GetWNDSize(); CompilationProgressWindow window = (CompilationProgressWindow)EditorWindow.GetWindow(typeof(CompilationProgressWindow), true, "F# Compilation progress", true); window.position = new Rect(mainWND.x/2-200, mainWND.y / 2 - 50, 400, 100); window.title = "F# compilation progress"; window.Focus(); me = window; } else { me.Focus(); } } void OnGUI() { string msg = ""; switch (CollectCompileDeploy._current) { case CollectCompileDeploy.CompilationState.GATHER: msg = "Gathering data"; break; case CollectCompileDeploy.CompilationState.NONE: this.Close(); break; case CollectCompileDeploy.CompilationState.COMPIL: msg = "Compiling F# assembly"; break; case CollectCompileDeploy.CompilationState.DONE: msg = "Done! Wait for assembly import and enjoy"; break; case CollectCompileDeploy.CompilationState.SOLUTION: msg = "Preparing solution files for usage"; break; case CollectCompileDeploy.CompilationState.VALIDATION: msg = "Validating editor scripts"; break; } EditorGUI.ProgressBar(new Rect(0, 0, 400, 100), ((float)CollectCompileDeploy._current) / 5f, msg); } public void OnLostFocus() { this.Focus(); } public static void Remove() { if (me != null) { me.Close(); } else { } } }
switch, . GetWNDSize.
GetForegroundWindow System.Diagnostics.Process.GetCurrentProcess MainWindowTitle null,
GetWindowRect ,
MainWindowHandle , (0,0). , . , , , , - , () . , , - Apple, , , . Unity3D . , . , ,
CollectCompileDeploy._current CompilationState.NONE.
. UnityPackage . ( ┬л ┬╗?).
PS F# . . , .
UPD1 : , ( Flash тАФ ). UnityPackage . gnoblin ' Android.
UPD2 : Google Docs