我在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兼容性的最佳方式。
答案 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());
}
}
}