从Unity

时间:2016-04-08 14:00:51

标签: c# php unity3d

您好我一直在Unity制作应用程序,我一直在尝试添加将记录用户操作的代码,即他们已经制作了某个游戏对象。我要做的是写入存储在服务器上的.txt文件我有以下代码,它基于:

http://answers.unity3d.com/questions/984290/upload-txt-file-to-server-using-php.html

并且他们建议它有效,对我而言,它不是在文件中写任何内容。

这是我的PHP代码(SaveData.php):

<?php
         $Action = $_GET["action"];
         $Date = date('Y/m/d H:i:s');

         $myFile = "TestingData.txt";
         $fh = fopen($myFile, 'a') or die("can't open file");
         fwrite($fh,$Action . "," . $Date . "\n");
         fclose($fh);
 ?>

这是我附加到游戏对象的C#(SaveData.cs)我在检查器窗口中更改了Action值:

using UnityEngine;
using System.Collections;

public class SaveData : MonoBehaviour {

public string postDataURL = "http://arinstructionman.byethost7.com/SaveData.php?"; //add a ? to your url

         public string Action;

     void Start()
     {

         StartCoroutine(PostData(Action));
     }

     IEnumerator PostData(string action)
     {

         string post_url = postDataURL + "action=" + WWW.EscapeURL(action);

         WWW data_post = new WWW(post_url);

         yield return data_post;

         if (data_post.error != null)
         {
             print("There was an error saving data: " + data_post.error);
         }
     } 
 }

如果我复制post_url值并在浏览器中运行它似乎工作正常,任何人都可以建议我做错了吗?

post_url输出:

http://arinstructionman.byethost7.com/SaveData.php?action=Plane+Visible

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

我建议您使用$_POST代替$_GET进行尝试,看看是否有不同的回复。
此外,您可以使用file_put_contents在一行中打开,写入和关闭文件,并使用FILE_APPEND标志来防止覆盖现有文件。如果该文件不存在,这也将为您创建该文件。

<?php
    if(!isset($_POST["action"])) 
    {
        echo ("NO DATA RECIEVED");
        return;
    }

    $action = $_POST["action"];
    $date = date('Y/m/d H:i:s');
    $data = "{$action},{$date}\n";
    $myFile = "TestingData.txt";

    if(file_put_contents($myFile, $data, FILE_APPEND))
        echo ("success");
    else
        echo ("failed to write file);
 ?>

使用WWWformPOST数据到PHP文件:

public string postDataURL = "http://arinstructionman.byethost7.com/SaveData.php";
public string Action = "some action";

void Start()
{
    StartCoroutine(PostData(Action));
}

IEnumerator PostData(string action)
{
    WWWForm form = new WWWForm();
    form.AddField("action", action);
    WWW dataPost = new WWW(postDataURL, form);

    yield return dataPost;

    if (dataPost.error != null)
        print("There was an error saving data: " + data_post.error);
    else
        print(dataPost.text);
}

答案 1 :(得分:0)

)

以防万一有人试图实现它并且它不像我的情况那样工作。 我找到了一个修复程序,这肯定不是最好的实现,但至少目前它有效:

如果您的服务器不使用 PHP5,则必须使用 PHP4 功能
(来自:http://memo-web.fr/categorie-php-126/):

function file_put_contents_PHP4($myFile, $data) {
        $f = @fopen($myFile, 'w');
        if (!$f) {
            echo ("failed to write file");
            return false;
        } else {
            $resultat= fwrite($f, $data);
            fclose($f);
            echo ("success");
            return $resultat;
        }
    }

我们当然可以测试 PHP5 是否可用,但我的 php 知识有点糟糕啊:

 if (!function_exists('file_put_contents')) 
{
  function file_put_contents_PHP4...
{

脚本:

SaveData.php,在您的服务器在线:

<?php
$action = $_POST["action"];
$data = "{$action}";
$myFile = "TestingData.txt";


    if($action == "") 
    {
        echo ("NO DATA RECIEVED");
        return;
    }
    else
        file_put_contents_PHP4($myFile, $data);


    function file_put_contents_PHP4($myFile, $data) {
        $f = @fopen($myFile, 'w');
        if (!$f) {
            echo ("failed to write file");
            return false;
        } else {
            $resultat= fwrite($f, $data);
            fclose($f);
            echo ("success");
            return $resultat;
        }
    }
?>

Unity c# 脚本

[SerializeField] private string postDataURL = "http://yourebsite.com/SaveData.php";
[SerializeField] private string Action = "some action";

void Start()
{
    StartCoroutine(PostData(Action));
}

IEnumerator PostData(string action)
{
    WWWForm form = new WWWForm();
    form.AddField("action", action);
    WWW dataPost = new WWW(postDataURL, form);

    yield return dataPost;

    if (dataPost.error != null)
        print("There was an error saving data: " + dataPost.error);
    else
        print(dataPost.text);
}

不要忘记在“SaveData.php”旁边放置一个空文本文件“TestingData.txt”到服务器中。 不要忘记将正确的地址添加到检查器中的 SaveData.php。 我使用 Filezilla 将它们上传到旧的个人服务器,一切都按预期工作。

干杯:-)