2016-06-02 15 views
0
  • ich ein IOS SDK für Unity/COCOS/SpritKit Spiel App aufzeichnen video.Main Programm entwickeln wollen, ist auf synthetische Video nach Screenshots.Nehmen Sie einen Screenshot auf ios für Unity/COCOS/SpritKit Spiele

  • Jetzt mache ich den Test mit IOS-Projekt von der Einheit Spiel auf IOS 7.0-Gerät und versuchen Opengl Funktion glreadpiexls() verwenden Pixelpuffer zu lesen, bekam aber immer das schwarze Bild, das für Wochen beunruhigt mich. Ich versuche einige Lösungen wie den Kontext zu setzen und die EAGLView-Zeichnungseigenschaft vor glreadpiexls() zu setzen, aber nicht zu arbeiten. Und einige schlagen vor, sicherzustellen, glareadpiexls() vor presentRenderbuffer auszuführen, aber wie. Ich kann den Code von Unity nicht ändern.

  • Lösungen wie IOSuface unter iOS 9.0 abgeschrieben und scheint nur für UIView Elemente und IOSurface wurde auf iOS 9.0 abgeschrieben und scheint nur für UIView Elemente. RenderTexture oder Application.CaptureScreenshot sind nur für Unity-Projekte, nicht für mein IOS SDK.

So

mir So kann jemand ein paar Vorschläge für die Einheit/COCOS/SpritKit Spiele für den Screenshot auf iOS geben, und das ist mein aktueller Code.

int w = 320;//size.width;//viewport[2];// 
int h = 480;//size.height;//viewport[3];// 
NSInteger myDataLength = w * h * 4;  

// allocate array and read pixels into it. 
GLubyte *buffer = (GLubyte *) malloc(myDataLength); 

glReadPixels (0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, Puffer);

GLubyte *buffer2 = (GLubyte *) malloc(myDataLength); 
GLubyte temp = 0; 
int index1 = 0; 
int index2 = 0; 
for(int y = 0; y < h - 1 - y; y++) { // 交换 
    index1 = y * 4 * w; 
    index2 = (h -1 - y) * w * 4; 
    for(int x = 0; x <w * 4; x++) { 
     temp = buffer[index1 + x]; 
     buffer[index1 + x] = buffer[index2 + x]; 
     buffer[index2 + x] = temp; 
    } 
} 

// make data provider with data. 
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, myDataLength, NULL); 


// prep the ingredients 
int bitsPerComponent = 8; 
int bitsPerPixel = 32; 
int bytesPerRow = 4 * w; 
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); 
// make the cgimage 
CGImageRef imageRef = CGImageCreate(w, h, bitsPerComponent, bitsPerPixel, bytesPerRow, CGColorSpaceCreateDeviceRGB(), kCGBitmapByteOrderDefault, provider, NULL, NO, kCGRenderingIntentDefault); 

// myImage is alway nil when debug 
UIImage *myImage = [ UIImage imageWithCGImage:imageRef scale:s orientation:UIImageOrientationUp ];  
CGDataProviderRelease(provider); 
CGColorSpaceRelease(colorSpaceRef); 

Antwort

0

Und einige vorschlagen glreadpiexls() vor presentRenderbuffer, um sicherzustellen, aber wie auszuführen. Ich kann den Code von Unity nicht ändern.

Was sie sagen, ist, dass Sie diesen Code in eine einfache Funktion konvertieren sollten. Zum Beispiel void takeScreenShot(){//your code here} dann wandeln Sie es in ein Plugin um. Here ist, wie man das macht.

Nachdem Sie in ein Plugin konvertiert haben, erstellen Sie ein einfaches Skript in Unity und nennen es UnityCam. Hängen Sie dieses Skript an den Hauptknoten Camera in Unity an. Rufen Sie im Unity-Cam-Skript die takeScreenShot() Ihres iOS-Plugins auf. Sie sollten NUR rufen Sie es von der OnPostRender() Rückruffunktion nicht von Start() oder Update() Funktion.

Wenn das nicht funktioniert, gibt es eine neue versteckt und undokumentierte Unity API für Video auf iOS Aufnahme. Laden Sie zunächst Unity 5.4 herunter, und verwenden Sie dann den folgenden Code, um Video auf iOS aufzunehmen. Unity arbeitet an der Aufnahme für Android auch, aber da diese Frage über iOS ist, sollte der Code unten tun. Beachten Sie, dass es nur von iOS 9 und höher funktioniert.

using UnityEngine.Apple.ReplayKit; 

void startRecordingOnIOS() 
{ 
    if (ReplayKit.APIAvailable) 
    { 
     if (ReplayKit.isRecording) 
     { 
      ReplayKit.StopRecording(); 
     } 
     ReplayKit.StartRecording(true);//True to use mic, false not not use mic 
    } 
    else 
    { 
     //Fallback. Use your code from your question() 
    } 
} 

void stopRecordingOnIOS() 
{ 
    if (ReplayKit.APIAvailable) 
    { 
     if (ReplayKit.isRecording) 
     { 
      ReplayKit.StopRecording(); 
     } 
    } 
    else 
    { 
     //Fallback. Use your code from your question() 
    } 
} 

void viewRecordedVideoOnIOS() 
{ 
    if (ReplayKit.APIAvailable) 
    { 
     if (ReplayKit.recordingAvailable) 
     { 
      ReplayKit.Preview(); 
     } 
    } 
    else 
    { 
     //Fallback. Use your code from your question() 
    } 
} 

void discardRecordedVideoOnIOS() 
{ 
    if (ReplayKit.APIAvailable) 
    { 
     if (ReplayKit.isRecording) 
     { 
      ReplayKit.Discard(); 
     } 
    } 
    else 
    { 
     //Fallback. Use your code from your question() 
    } 
} 
+0

Dank für yoour patients.When Einheit Projekt Release IOS, es auf XCode öffnen und meine Aufnahme hinzufügen sdk.And die Tatsache ist, dass ich kann den Teil des Codes von Unity5 oder cocos usw. nicht ändern I Ich möchte nur ein allgemeines IOS SDK für Spiele entwickeln, die von Engines wie unity3D oder Cocos etc. entwickelt werden. –

+0

@JackMei Es ist wirklich schwer, deinen Kommentar zu verstehen. Wenn Sie eine Aufzeichnungs-API für Unity entwickeln, reicht meine Antwort aus, um Sie zu starten. Verwenden Sie die integrierte API von Unity. Wenn es auf diesem Gerät nicht verfügbar ist, verwenden Sie das Plugin aus Ihrer Frage. Wenn Sie möchten, dass jemand Ihre SDK in Unity verwenden kann, müssen Sie es zu einem Plugin machen, so dass sie alles von der Unity-Seite aus haben können. Sie erhalten einen schwarzen Bildschirm, weil Sie dies nicht von der Funktion 'OnPostRender() 'aus der Einheit aufrufen. All diese sind in meiner Antwort erwähnt. – Programmer

+0

Wirklich danke für deine Antwort. Ich weiß, dass es funktioniert, aber ich muss ein allgemeines ios sdk für Einheit/cocos/sprikit Spiele entwickeln. Ich entwickle eine Aufnahme API auf XCode nicht für Einheit. Für Spieleentwickler meines Teams werde ich eine Schnittstelle für das IOS-Projekt von einer der drei Motoren zur Verfügung stellen.So können Sie verstehen, was ich meine? –