建议如何使用Unity Facebook SDK的FB.API编辑发布到Facebook的文本

时间:2014-05-31 23:42:06

标签: unity3d facebook-unity-sdk

我在Unity3D上创建了一个游戏,我正在添加对Facebook的支持。我想要实现的是用户发布显示分数的游戏截图。 我在技术上取得了成功,但Facebook拒绝了我的游戏,因为与图片一起发布的短信被预先填写,这违反了他们的平台政策的第2.3节。

以下是我在我的基础上使用Facebook SDK for Unity附带的示例中的一些代码...我猜这个由Facebook创建的示例代码也不符合。

    private IEnumerator TakeScreenshot() 
{
    yield return new WaitForEndOfFrame();

    var width = Screen.width;
    var height = Screen.height;
    var tex = new Texture2D(width, height, TextureFormat.RGB24, false);
    // Read screen contents into the texture
    tex.ReadPixels(new Rect(0, 0, width, height), 0, 0);
    tex.Apply();
    byte[] screenshot = tex.EncodeToPNG();

    var wwwForm = new WWWForm();
    wwwForm.AddBinaryData("image", screenshot, "InteractiveConsole.png");
    wwwForm.AddField("message", "herp derp.  I did a thing!  Did I do this right?");

    FB.API("me/photos", Facebook.HttpMethod.POST, Callback, wwwForm);
}

因此,在投入大量时间在Unity3D中实施文本编辑器之前,我的目的是发布到Facebook,我正在寻找建议。

首先,有没有办法在不创建文本编辑器的情况下批准我的应用程序?

1)如果我发布截图,Facebook会批准我的游戏吗?或者我仍然会因发布预先填好的图片而遭到拒绝?

2)如果没有在Facebook上创建应用程序并请求批准“publish_actions”权限,有没有办法实现这一目标?也许将图像传递给Facebook App?

如果没有选项,我必须创建一个带触摸键盘的文本编辑器,以允许用户编辑消息,这是保持iOS,Android和Windows Phone 8兼容性的最佳方式。

1 个答案:

答案 0 :(得分:0)

我确实得到了Facebook的批准,但相信我,没有捷径。您需要为用户提供一种预览发布内容的方法,并在提交之前编辑文本。

最后,由于GUI控件,它并不那么难。您可以使用GUI.DrawTexture显示捕获的屏幕的预览。您可以使用GUI.TextField来允许用户编辑消息并使用GUI.Button来显示" Share"和"取消"纽扣。将所有这些代码放在OnGUI()方法上。

您甚至可以在TextBox旁边添加个人资料图片,以便用户获得社交感受,同时用户也知道哪个用户正在发帖。在我的测试中,我发现应用程序缓存了Facebook令牌,即使您在手机和Facebook应用程序上更改了Facebook用户,我的游戏也会在发布时继续使用原始用户。

由于问题集中在如何编辑文本而不是如何与Facebook交互,我将在此处发布GUI代码,但不会发布类似于我之前发布的Facebook代码。 代码假设您已经提到了所有纹理,并且用户已经同意为以下内容授予权限:" public_profile,publish_actions"。

该代码还使用名为socialAskMessage的布尔值,您需要将其设置为true才能显示用户界面。此外,当您设置socialAskMessage时,建议您忽略所有其他用户输入。在我的游戏中,我在另一个名为DelayedCanClick()的函数中0.5秒后重新激活所有用户输入。实际发布到facebook的方法驻留在我不在这里的social.PublishOnFacebook()中。

void OnGUI() {
//GUI.Label(new Rect(10, 10, 100, 20), "Res" + Screen.width + " x " + Screen.height);
if (socialAskMessage)
{
    //Background
    GUI.DrawTexture(new Rect(0f, 0f, Screen.width, Screen.height / 3f),socialBackground,ScaleMode.StretchToFill);
    //Screenshot
    GUI.DrawTexture(new Rect(margin, margin, Screen.width/3f - margin*2f, Screen.height / 3f - margin*2f),screenshot,ScaleMode.ScaleToFit);
    //Profile Picture
    if (profilePicture != null)
        GUI.DrawTexture(new Rect(Screen.width*7f/10f,Screen.height/9f,83f*Screen.width/960f,83f*Screen.width/960f), profilePicture);

    //Hanlde Enter/Return event/Share Button
    if (GUI.Button(new Rect(Screen.width*8f/10f,Screen.height/9f,83f*Screen.width/960f,83f*Screen.width/960f),shareButtonTexture,emptyGUIStyle)
        ||
        ( (Event.current.type == EventType.KeyDown) && (Event.current.keyCode == KeyCode.Return || Event.current.keyCode == KeyCode.KeypadEnter) ) 
        )
    {
        audioTac.Play();
        if (socialMessage.StartsWith("Write"))
            socialMessage = "";
        else if (socialMessage.Length > 0)
        {
            socialAskMessage = false;
            social.PublishOnFacebook();
        }
        else //If empty
            socialMessage = "Write a comment...";

    }

    //Hanlde ESC/Cancel Button
    if (GUI.Button(new Rect(Screen.width*9f/10f,Screen.height/9f,83f*Screen.width/960f,83f*Screen.width/960f),cancelButtonTexture,emptyGUIStyle)
        ||
        ( (Event.current.type == EventType.KeyDown) && (Event.current.keyCode == KeyCode.Escape) ) 
        )
    {
        audioTac.Play();
        socialAskMessage = false;
    }

    if (socialAskMessage) //If still needed, show it
    {
        GUI.skin.textField.fontSize = 22;
        GUI.skin.textField.fontStyle = FontStyle.Bold;
        GUI.skin.textField.wordWrap = true;
        GUI.skin.textField.focused.textColor = Color.white;
        GUI.SetNextControlName("socialTextArea");
        socialMessage = GUI.TextField(new Rect(Screen.width/3f, margin, Screen.width/2.75f - margin*2f, Screen.height / 3f - margin*2f), socialMessage, 200);
        GUI.FocusControl("socialTextArea");
        if ((socialMessage.Length == 17 || socialMessage.Length == 19) && socialMessage.StartsWith("Write a comment"))
            socialMessage = socialMessage.Replace("Write a comment","").Replace(".","");
    }
    else //Dont show it anymore, reactivate click
    {
        StartCoroutine(DelayedCanClick());
    }
}
}