Sen descrición

Rusty.cs 1.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using System;
  2. using System.Runtime.InteropServices;
  3. using System.Text;
  4. using UnityEngine;
  5. using UnityEngine.Events;
  6. public class FFI
  7. {
  8. #if UNITY_IOS || UNITY_TVOS
  9. public const string ImportName = "__Internal";
  10. #else
  11. public const string ImportName = "rusty";
  12. #endif
  13. }
  14. internal class StringHandle : SafeHandle
  15. {
  16. [DllImport(FFI.ImportName)]
  17. private static extern void FreeString(IntPtr handle);
  18. public StringHandle() : base(IntPtr.Zero, true) { }
  19. public override bool IsInvalid
  20. {
  21. get { return false; }
  22. }
  23. public string AsString()
  24. {
  25. int len = 0;
  26. while (Marshal.ReadByte(handle, len) != 0) { ++len; }
  27. byte[] buffer = new byte[len];
  28. Marshal.Copy(handle, buffer, 0, buffer.Length);
  29. return Encoding.UTF8.GetString(buffer);
  30. }
  31. protected override bool ReleaseHandle()
  32. {
  33. FreeString(handle);
  34. return true;
  35. }
  36. }
  37. [System.Serializable]
  38. public class StatusChangedEvent : UnityEvent<string> { }
  39. public class Rusty : MonoBehaviour
  40. {
  41. [DllImport(FFI.ImportName)]
  42. private static extern StringHandle DoSomeInterestingWork(int count, string content);
  43. public StatusChangedEvent OnStatusChanged;
  44. // Start is called before the first frame update
  45. void Start()
  46. {
  47. }
  48. // Update is called once per frame
  49. void Update()
  50. {
  51. }
  52. public void SayHello()
  53. {
  54. var rng = new System.Random();
  55. OnStatusChanged.Invoke(DoSomeInterestingWork(rng.Next(1, 10), "Hello").AsString());
  56. }
  57. }