png调用 unity3d_unity 3d texture png - CSDN
  • c#远程调用python可以使用XMLRPC技术(使用别人写好的库CookComputing.XmlRpcV2.dll),可以...但是在unity3d中使用就不行了,可能是unity3d引擎做了特殊的限制,为了实现unity3d能够远程调用python,我们需要自己编写x...

    c#远程调用python可以使用XMLRPC技术(使用别人写好的库CookComputing.XmlRpcV2.dll),可以参考https://blog.csdn.net/zxy13826134783/article/details/102977028

    但是在unity3d中使用就不行了,可能是unity3d引擎做了特殊的限制,为了实现unity3d能够远程调用python,我们需要自己编写xml请求数据和模拟post请求

     

    下面介绍两种方式,一种是使用unity3d的协程的方式模拟post请求,一种是使用c#的同步的方式模拟post请求

     

    我想实现的大概流程是:

    unity3d客户端读取图片文件,把图片文件数据转换为字节,再转换成base64的字符串发送到远程的python服务端,远程服务端接收图片数据并以png格式写入服务端的硬盘中

     

    远程服务器代码如下(python,如何在服务器运行下面的代码可以参考我前面给出链接的文章):

    注意:如果你的服务端是在阿里云或者腾讯云等云上,需要到控制台中开放666端口

    import base64
    from  xmlrpc.server import SimpleXMLRPCServer
    import cv2
    import numpy as np
    def zi_tu(b_tu):
        tu_b = base64.b64decode(b_tu)
        imga = np.frombuffer(tu_b, np.uint8)
        img = cv2.imdecode(imga,cv2.IMREAD_COLOR)
        cv2.imwrite("./server.png",img)
        print(img)
        return None
    
    def getHelloWorld(b_tu):
        zi_tu(b_tu)
        return 'Hello world'
     
    if __name__ == '__main__' :
        server = SimpleXMLRPCServer(("",666), allow_none=True)
        server.register_function(getHelloWorld, "getHelloWorld")
        server.serve_forever()
    

     

     

    unity3d客户端代码:

     

    读取图片文件的代码(放心,后面我会给出全部的代码):

        //图片转换为base64的字符串
        string ImageString = "";
        //定义文件流,读取图片文件,需要你自己放一张png图片在unity3d工程目录下
        FileStream fs = File.OpenRead("test.png"); //OpenRead
        int filelength = 0;
        filelength = (int)fs.Length; //获得文件长度 
        Byte[] image = new Byte[filelength]; //建立一个字节数组 
        fs.Read(image, 0, filelength); //按字节流读取 
        //把图片的字节流转换为base64的字符串,方便发送到python服务器
        ImageString=Convert.ToBase64String(image);
        fs.Close();

     

    拼接xml请求数据方法如下:

     /// <summary>
        /// 拼接要传递的xml参数
        /// </summary>
        /// <param name="FieldArray">包含方法参数值的Hashtable</param>
        /// <param name="MethodName">要远程调用的方法名</param>
        /// <returns></returns>
        public string buildXMLRPCRequest(Hashtable FieldArray, string MethodName)
        {
            //要发送的xml字符串
            //下面的<value><string>" + FieldArray["para1"] + @"</string></value>
            //是拼接方法的参数,现在传递的是字符串,所以需要拼接<string>标签,如果发送的是整形数据
            //需要拼接<int>,如果要传递多个参数,根据需要在<param>标签下添加<value>标签
            string SendXmlString = @"<?xml version='1.0'?>
    <methodCall>
       <methodName>"+MethodName+@"</methodName>
          <params>
             <param>
                <value><string>" + FieldArray["para1"] + @"</string></value>
             </param>
          </params>
    </methodCall>";
            return SendXmlString;
        }

     

    方式1   使用unity3d协程的方式的代码如下:

        /// <summary>
        /// 使用Unity3d特有的协程方式发送远程调用请求
        /// </summary>
        /// <param name="MethodName">要远程调用的方法名</param>
        /// <param name="FieldArray">包含的方法参数值的Hashtable</param>
        public void UnityPostXML( string MethodName,Hashtable FieldArray)
        {
            //python服务端的url地址
            string WebServiceURL = "http://47.94.102.147:666/";
    
            //获取发送的xml请求字符串
            string XMLRequest = buildXMLRPCRequest(FieldArray, MethodName);
    
            //把xml请求字符串转换为字节数组,方便发送
            System.Text.Encoding enc = System.Text.Encoding.UTF8;
            byte[] myByteArray = enc.GetBytes(XMLRequest);
    
    
    
    
            var form = new WWWForm();
            var url = WebServiceURL;
    
            
            //获取请求头请指定请求头类型
            var headers = form.headers;
            headers["Content-Type"] = "text/xml;charset=UTF-8";
    
          
            var www = new WWW(WebServiceURL, myByteArray, headers);
    
            
            //开启协程,发送请求
            StartCoroutine(WaitForRequest(www));
        }
    
    
        IEnumerator WaitForRequest(WWW www)
        {
            yield return www;
    
            // 没有出错
            if (www.error == null)
            {
                Debug.Log("请求的内容为: " + www.text);
            }
            else
            {
                Debug.Log("请求出错 " + www.error);
            }
        }

     

    方式2   使用c#的同步的方式的代码如下:

        /// <summary>
        /// C#方式远程调用
        /// </summary>
        /// <param name="MethodName">需要远程调用的方法名</param>
        /// <param name="Fields">带有方法参数值的Hashtable</param>
        /// <returns></returns>
        private  string NormalXMLCall( string MethodName, Hashtable Fields)
        {
            //远程python服务端的地址
            string WebServiceURL = "http://47.94.102.147:666";
    
            //获取发送的xml请求字符串
            string XMLRequest = buildXMLRPCRequest(Fields, MethodName);
            
            //创建Http请求对象
            HttpWebRequest httpRequest =(HttpWebRequest)WebRequest.Create(WebServiceURL);
            //请求方式为Post
            httpRequest.Method = "POST";
    
            //指定发送的内容格式
            httpRequest.ContentType = "text/xml";
    
            //把xml请求字符串转换为字节数组,方便发送 
            byte[] bytedata = Encoding.UTF8.GetBytes(XMLRequest);
    
            // 获取请求流.
            Stream requestStream = httpRequest.GetRequestStream();
    
            // 把数据写入请求流中
            requestStream.Write(bytedata, 0, bytedata.Length);
            requestStream.Close();
    
            //获取响应流对象
            HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse();
    
            //获取响应流
            Stream receiveStream = httpResponse.GetResponseStream ();
    
            //指定流读取器
            StreamReader readStream = new StreamReader (receiveStream, Encoding.UTF8);
            //读取相应数据,xml格式返回,需要自己解析
            string  ReceivedData    =   readStream.ReadToEnd ();
            httpResponse.Close ();
            readStream.Close ();
    
            return  ReceivedData;
        }

     

    全部代码如下:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    using System.Net;
    using System.Text;
    using System.Threading;
    using UnityEngine;
    
    public class NewBehaviourScript : MonoBehaviour {
        //图片转换为base64的字符串
        string ImageString = "";
    	void Start () {
                
                //定义文件流,读取图片文件
                FileStream fs = File.OpenRead("test.png"); //OpenRead
                int filelength = 0;
                filelength = (int)fs.Length; //获得文件长度 
                Byte[] image = new Byte[filelength]; //建立一个字节数组 
                fs.Read(image, 0, filelength); //按字节流读取 
                //把图片的字节流转换为base64的字符串,方便发送到python服务器
                ImageString=Convert.ToBase64String(image);
                fs.Close();
    
                try
                {
                    //客户端远程调用python的方法,自定义Post方式发送
                    XMLRpcMethod(ImageString);
    
                }
                catch (Exception ex)
                {
                    Debug.Log("发生异常" + ex.Message);
    
                }
    	}
    
    
        /// <summary>
        /// 客户端远程调用python的方法,自定义Post方式发送
        /// </summary>
        /// <param name="ImageString">传递过去的图片数据</param>
        void XMLRpcMethod(string ImageString)
        {
            Hashtable ht = new Hashtable();
            //定义参数的键值对,值保存对应的方法参数的值
            ht.Add("para1", ImageString);
    
            //方式1:使用unity3d特有的协程的方式远程调用
            //UnityPostXML("getHelloWorld", ht); 
            
    
            //方式2:使用传统的c#方式进行远程调用,第一个参数为方法名,第二个参数存储方法参数的值
            string returnData=NormalXMLCall("getHelloWorld", ht);
            Debug.Log(returnData);
           
        }
    
    
        /// <summary>
        /// 拼接要传递的xml参数
        /// </summary>
        /// <param name="FieldArray">包含方法参数值的Hashtable</param>
        /// <param name="MethodName">要远程调用的方法名</param>
        /// <returns></returns>
        public string buildXMLRPCRequest(Hashtable FieldArray, string MethodName)
        {
            //要发送的xml字符串
            //下面的<value><string>" + FieldArray["para1"] + @"</string></value>
            //是拼接方法的参数,现在传递的是字符串,所以需要拼接<string>标签,如果发送的是整形数据
            //需要拼接<int>,如果要传递多个参数,根据需要在<param>标签下添加<value>标签
            string SendXmlString = @"<?xml version='1.0'?>
    <methodCall>
       <methodName>"+MethodName+@"</methodName>
          <params>
             <param>
                <value><string>" + FieldArray["para1"] + @"</string></value>
             </param>
          </params>
    </methodCall>";
            return SendXmlString;
        }
    
    
    
    
        /// <summary>
        /// 使用Unity3d特有的协程方式发送远程调用请求
        /// </summary>
        /// <param name="MethodName">要远程调用的方法名</param>
        /// <param name="FieldArray">包含的方法参数值的Hashtable</param>
        public void UnityPostXML( string MethodName,Hashtable FieldArray)
        {
            //python服务端的url地址
            string WebServiceURL = "http://47.94.102.147:666/";
    
            //获取发送的xml请求字符串
            string XMLRequest = buildXMLRPCRequest(FieldArray, MethodName);
    
            //把xml请求字符串转换为字节数组,方便发送
            System.Text.Encoding enc = System.Text.Encoding.UTF8;
            byte[] myByteArray = enc.GetBytes(XMLRequest);
    
    
    
    
            var form = new WWWForm();
            var url = WebServiceURL;
    
            
            //获取请求头请指定请求头类型
            var headers = form.headers;
            headers["Content-Type"] = "text/xml;charset=UTF-8";
    
          
            var www = new WWW(WebServiceURL, myByteArray, headers);
    
            
            //开启协程,发送请求
            StartCoroutine(WaitForRequest(www));
        }
    
    
        IEnumerator WaitForRequest(WWW www)
        {
            yield return www;
    
            // 没有出错
            if (www.error == null)
            {
                Debug.Log("请求的内容为: " + www.text);
            }
            else
            {
                Debug.Log("请求出错 " + www.error);
            }
        }
    
    
    
        /// <summary>
        /// C#方式远程调用
        /// </summary>
        /// <param name="MethodName">需要远程调用的方法名</param>
        /// <param name="Fields">带有方法参数值的Hashtable</param>
        /// <returns></returns>
        private  string NormalXMLCall( string MethodName, Hashtable Fields)
        {
            //远程python服务端的地址
            string WebServiceURL = "http://47.94.102.147:666";
    
            //获取发送的xml请求字符串
            string XMLRequest = buildXMLRPCRequest(Fields, MethodName);
            
            //创建Http请求对象
            HttpWebRequest httpRequest =(HttpWebRequest)WebRequest.Create(WebServiceURL);
            //请求方式为Post
            httpRequest.Method = "POST";
    
            //指定发送的内容格式
            httpRequest.ContentType = "text/xml";
    
            //把xml请求字符串转换为字节数组,方便发送 
            byte[] bytedata = Encoding.UTF8.GetBytes(XMLRequest);
    
            // 获取请求流.
            Stream requestStream = httpRequest.GetRequestStream();
    
            // 把数据写入请求流中
            requestStream.Write(bytedata, 0, bytedata.Length);
            requestStream.Close();
    
            //获取响应流对象
            HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse();
    
            //获取响应流
            Stream receiveStream = httpResponse.GetResponseStream ();
    
            //指定流读取器
            StreamReader readStream = new StreamReader (receiveStream, Encoding.UTF8);
            //读取相应数据,xml格式返回,需要自己解析
            string  ReceivedData    =   readStream.ReadToEnd ();
            httpResponse.Close ();
            readStream.Close ();
    
            return  ReceivedData;
        }
    
    
    
        /// <summary>
        /// 解析xml,获取返回的内容
        /// </summary>
        /// <param name="ReturnXml">需要解析的xml字符串</param>
        /// <returns></returns>
        public string findValue(string ReturnXml)
        {
            //找出两个标签的下标值,然后截取
            int first=ReturnXml.IndexOf("<string>", 0);
            int second = ReturnXml.IndexOf("</string>", first);
            string value = ReturnXml.Substring(first + 8, second - first-8);
            return value;
        }
    
    
    }
    
    
    
    

     

     

     

     

    以方式2发起调用的结果如下:

     

    服务端运行结果:

    打印输出如下,输出的是以三维数组表示的图片数据

    同时可以看到图片已经保存在服务端上

     

    unity3d返回的数据打印输出如下:

     

    可以看到是xml格式的,看到Hello world已经正确返回

     

    针对我这个特定的测试方法,我的解析xml的方法如下:

        /// <summary>
        /// 解析xml,获取返回的内容
        /// </summary>
        /// <param name="ReturnXml">需要解析的xml字符串</param>
        /// <returns></returns>
        public string findValue(string ReturnXml)
        {
            //找出两个标签的下标值,然后截取
            int first=ReturnXml.IndexOf("<string>", 0);
            int second = ReturnXml.IndexOf("</string>", first);
            string value = ReturnXml.Substring(first + 8, second - first-8);
            return value;
        }

     

    这样就可以吧Hello world信息给取出来了

     

    展开全文
  • unity3d调用windows窗体

    2016-04-20 15:57:11
    unity3d调用windows窗体
    #region 类
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public class OpenFileName
    {
    public int structSize = 0;
    public IntPtr dlgOwner = IntPtr.Zero;
    public IntPtr instance = IntPtr.Zero;
    public String filter = null;
    public String customFilter = null;
    public int maxCustFilter = 0;
    public int filterIndex = 0;
    public String file = null;
    public int maxFile = 0;
    public String fileTitle = null;
    public int maxFileTitle = 0;
    public String initialDir = null;
    public String title = null;
    public int flags = 0;
    public short fileOffset = 0;
    public short fileExtension = 0;
    public String defExt = null;
    public IntPtr custData = IntPtr.Zero;
    public IntPtr hook = IntPtr.Zero;
    public String templateName = null;
    public IntPtr reservedPtr = IntPtr.Zero;
    public int reservedInt = 0;
    public int flagsEx = 0;
    }

    #endregion


    #region 窗体DLL
    public class WindowDll
    {
        [DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
        public static extern bool GetOpenFileName([In, Out] OpenFileName ofn);
        public static bool GetOpenFileName1([In, Out] OpenFileName ofn)
        {
            return GetOpenFileName(ofn);
        }
    }
    #endregion


    #region  文件调用脚本
    public class FileMenu : MonoBehaviour
    {
        public GameObject ImageGameObject;


       public void ClickLoadButton()
        {
            OpenFileName ofn = new OpenFileName();
            
            ofn.structSize = Marshal.SizeOf(ofn);
            ofn.filter = "*.jpg;*.png;*.jpeg";              //文件类型
            ofn.file = "C:\\Users\\A\\Desktop\\qw\\" + ofn.filter;
            ofn.maxFile = ofn.file.Length;
            //注意 一下项目不一定要全选 但是0x00000008项不要缺少
            ofn.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;//OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST| OFN_ALLOWMULTISELECT|OFN_NOCHANGEDIR
            if (WindowDll.GetOpenFileName(ofn))
            {
                StartCoroutine(WaitLoad(ofn.file));//加载图片到Image
            }
        }
        IEnumerator WaitLoad(string fileName)
        {
            WWW wwwTexture = new WWW("file://" + fileName);  
            yield return wwwTexture;
            Sprite sprite = Sprite.Create(wwwTexture.texture,new Rect(0,0,wwwTexture.texture.width,wwwTexture.texture.height),new Vector2(0.5f,0.5f));
            ImageGameObject.GetComponent<Image>().sprite = sprite;
        }
    }
    #endregion




    参照博客    http://blog.csdn.net/awnuxcvbn/article/details/21277481

    展开全文
  • 经过前面《Unity3D入门教程》系列讲解,再加上我们自己的探索,相信大家已经掌握了Unity3D的相关知识和基本方法。本文将使用前面学到的知识,开发一款简单的五子棋程序。本文用到的东西其实不多,非常简单。在最后...

    前言

    经过前面《Unity3D入门教程》系列讲解,再加上我们自己的探索,相信大家已经掌握了Unity3D的相关知识和基本方法。本文将使用前面学到的知识,开发一款简单的五子棋程序。本文用到的东西其实不多,非常简单。在最后我们会把完整工程的源代码发布出来,以供初学者参考。先展示一下最后的运行效果吧。

    1 准备工作

    (1)开发环境:Win10 + Unity5.4.1

    (2)图片素材准备:

    黑棋子和白棋子

       

    棋盘


    获胜提示图片




    2 开发流程

    上文提到的素材可以直接下载我们给出的这些图,也可以自己制作。注意黑白棋子要做成PNG格式,以保证显示的时候棋子四个角是透明的。将用到的图片素材导入到工程当中。新建一个场景,创建一个Plane,作为MainCamera的子物体。将棋盘贴图拖动到Plane上,并且将Plane正面面向摄像机。


    再创建四个sphere,作为Plane的子物体,分别命名为LeftTop、RightTop、LeftBottom、RightBottom。然后把他们的MeshRenderer勾选掉。这些球是为了计算棋子落点所设置的,所以需要把它们与棋盘的四个角点对准。


    然后我们创建一个chess.cs脚本,绑定到MainCamera上。脚本中包含了所有的功能。需要绑定的一些物体如图所示。


    chess.cs脚本如下:

    using UnityEngine;
    using System.Collections;
    
    public class chess : MonoBehaviour {
    
    	//四个锚点位置,用于计算棋子落点
    	public GameObject LeftTop;
    	public GameObject RightTop;
    	public GameObject LeftBottom;
    	public GameObject RightBottom;
    	//主摄像机
    	public Camera cam;
    	//锚点在屏幕上的映射位置
    	Vector3 LTPos;
    	Vector3 RTPos;
    	Vector3 LBPos;
    	Vector3 RBPos;
    
    	Vector3 PointPos;//当前点选的位置
    	float gridWidth =1; //棋盘网格宽度
    	float gridHeight=1; //棋盘网格高度
    	float minGridDis;  //网格宽和高中较小的一个
    	Vector2[,] chessPos; //存储棋盘上所有可以落子的位置
    	int[,] chessState; //存储棋盘位置上的落子状态
    	enum turn {black, white } ;
    	turn chessTurn; //落子顺序
    	public Texture2D white; //白棋子
    	public Texture2D black; //黑棋子
    	public Texture2D blackWin; //白子获胜提示图
    	public Texture2D whiteWin; //黑子获胜提示图
    	int winner = 0; //获胜方,1为黑子,-1为白子
    	bool isPlaying = true; //是否处于对弈状态
    	void Start () {
    		chessPos = new Vector2[15, 15];
    		chessState =new int[15,15];
    		chessTurn = turn.black;
    
    	}
    
    	void Update () {
    
    		//计算锚点位置
    		LTPos = cam.WorldToScreenPoint(LeftTop.transform.position);
    		RTPos = cam.WorldToScreenPoint(RightTop.transform.position);
    		LBPos = cam.WorldToScreenPoint(LeftBottom.transform.position);
    		RBPos = cam.WorldToScreenPoint(RightBottom.transform.position);
    		//计算网格宽度
    		gridWidth = (RTPos.x - LTPos.x) / 14;
    		gridHeight = (LTPos.y - LBPos.y) / 14;
    		minGridDis = gridWidth < gridHeight ? gridWidth : gridHeight;
    		//计算落子点位置
    		for (int i = 0; i < 15; i++)
    		{
    			for (int j = 0; j < 15; j++)
    			{
    				chessPos[i, j] = new Vector2(LBPos.x + gridWidth * i, LBPos.y + gridHeight * j);
    			}
    		}
    		//检测鼠标输入并确定落子状态
    		if (isPlaying && Input.GetMouseButtonDown(0))
    		{
    			PointPos = Input.mousePosition;
    			for (int i = 0; i < 15; i++)
    			{
    				for (int j = 0; j < 15; j++)
    				{   
    					//找到最接近鼠标点击位置的落子点,如果空则落子
    					if (Dis(PointPos, chessPos[i, j]) < minGridDis / 2 && chessState[i,j]==0)
    					{
    						//根据下棋顺序确定落子颜色
    						chessState[i, j] = chessTurn == turn.black ? 1 : -1;
    						//落子成功,更换下棋顺序
    						chessTurn = chessTurn == turn.black ? turn.white : turn.black;                        
    					}
    				}
    			}
    			//调用判断函数,确定是否有获胜方
    			int re = result();
    			if (re == 1)
    			{
    				Debug.Log("黑棋胜");
    				winner = 1;
    				isPlaying = false;
    			}
    			else if(re==-1)
    			{
    				Debug.Log("白棋胜");
    				winner = -1;
    				isPlaying = false;
    			}            
    		}
    		//按下空格重新开始游戏
    		if (Input.GetKeyDown(KeyCode.Space))
    		{
    			for (int i = 0; i < 15; i++)
    			{
    				for (int j = 0; j < 15; j++)
    				{
    					chessState[i, j] = 0;
    				}
    			}
    			isPlaying = true;
    			chessTurn = turn.black;
    			winner = 0;
    		}     
    	}
    	//计算平面距离函数
    	float Dis(Vector3 mPos, Vector2 gridPos)
    	{
    		return Mathf.Sqrt(Mathf.Pow(mPos.x - gridPos.x, 2)+ Mathf.Pow(mPos.y - gridPos.y, 2));
    	}
    
    	void OnGUI()
    	{ 
    		//绘制棋子
    		for(int i=0;i<15;i++)
    		{
    			for (int j = 0; j < 15; j++)
    			{
    				if (chessState[i, j] == 1)
    				{
    					GUI.DrawTexture(new Rect(chessPos[i,j].x-gridWidth/2, Screen.height-chessPos[i,j].y-gridHeight/2, gridWidth,gridHeight),black);
    				}
    				if (chessState[i, j] == -1)
    				{
    					GUI.DrawTexture(new Rect(chessPos[i, j].x - gridWidth / 2, Screen.height - chessPos[i, j].y - gridHeight / 2, gridWidth, gridHeight), white);
    				}               
    			}
    		}
    		//根据获胜状态,弹出相应的胜利图片
    		if (winner ==  1)
    			GUI.DrawTexture(new Rect(Screen.width * 0.25f, Screen.height * 0.25f, Screen.width * 0.5f, Screen.height * 0.25f), blackWin);
    		if (winner == -1)
    			GUI.DrawTexture(new Rect(Screen.width * 0.25f, Screen.height * 0.25f, Screen.width * 0.5f, Screen.height * 0.25f), whiteWin);
    
    	}
    	//检测是够获胜的函数,不含黑棋禁手检测
    	int result()
    	{
    		int flag = 0;
    		//如果当前该白棋落子,标定黑棋刚刚下完一步,此时应该判断黑棋是否获胜
    		if(chessTurn == turn.white)
    		{
    			for (int i = 0; i < 11; i++)
    			{
    				for (int j = 0; j < 15; j++)
    				{
    					if (j < 4)
    					{
    						//横向
    						if (chessState[i, j] == 1 && chessState[i, j + 1] == 1 && chessState[i, j + 2] == 1 && chessState[i, j + 3] == 1 && chessState[i, j + 4] == 1)
    						{
    							flag = 1;
    							return flag;
    						}
    						//纵向
    						if (chessState[i, j] == 1 && chessState[i + 1, j] == 1 && chessState[i + 2, j] == 1 && chessState[i + 3, j] == 1 && chessState[i + 4, j] == 1)
    						{
    							flag = 1;
    							return flag;
    						}
    						//右斜线
    						if (chessState[i, j] == 1 && chessState[i + 1, j + 1] == 1 && chessState[i + 2, j + 2] == 1 && chessState[i + 3, j + 3] == 1 && chessState[i + 4, j + 4] == 1)
    						{
    							flag = 1;
    							return flag;
    						}
    						//左斜线
    						//if (chessState[i, j] == 1 && chessState[i + 1, j - 1] == 1 && chessState[i + 2, j - 2] == 1 && chessState[i + 3, j - 3] == 1 && chessState[i + 4, j - 4] == 1)
    						//{
    						//    flag = 1;
    						//    return flag;
    						//}
    					}
    					else if (j >= 4 && j < 11)
    					{
    						//横向
    						if (chessState[i, j] == 1 && chessState[i, j + 1] == 1 && chessState[i, j + 2] == 1 && chessState[i, j + 3] == 1 && chessState[i, j + 4] == 1)
    						{
    							flag = 1;
    							return flag;
    						}
    						//纵向
    						if (chessState[i, j] == 1 && chessState[i + 1, j] == 1 && chessState[i + 2, j] == 1 && chessState[i + 3, j] == 1 && chessState[i + 4, j] == 1)
    						{
    							flag = 1;
    							return flag;
    						}
    						//右斜线
    						if (chessState[i, j] == 1 && chessState[i + 1, j + 1] == 1 && chessState[i + 2, j + 2] == 1 && chessState[i + 3, j + 3] == 1 && chessState[i + 4, j + 4] == 1)
    						{
    							flag = 1;
    							return flag;
    						}
    						//左斜线
    						if (chessState[i, j] == 1 && chessState[i + 1, j - 1] == 1 && chessState[i + 2, j - 2] == 1 && chessState[i + 3, j - 3] == 1 && chessState[i + 4, j - 4] == 1)
    						{
    							flag = 1;
    							return flag;
    						}
    					}
    					else
    					{
    						//横向
    						//if (chessState[i, j] == 1 && chessState[i, j + 1] == 1 && chessState[i, j + 2] == 1 && chessState[i, j + 3] == 1 && chessState[i, j + 4] == 1)
    						//{
    						//    flag = 1;
    						//    return flag;
    						//}
    						//纵向
    						if (chessState[i, j] == 1 && chessState[i + 1, j] == 1 && chessState[i + 2, j] == 1 && chessState[i + 3, j] == 1 && chessState[i + 4, j] == 1)
    						{
    							flag = 1;
    							return flag;
    						}
    						//右斜线
    						//if (chessState[i, j] == 1 && chessState[i + 1, j + 1] == 1 && chessState[i + 2, j + 2] == 1 && chessState[i + 3, j + 3] == 1 && chessState[i + 4, j + 4] == 1)
    						//{
    						//    flag = 1;
    						//    return flag;
    						//}
    						//左斜线
    						if (chessState[i, j] == 1 && chessState[i + 1, j - 1] == 1 && chessState[i + 2, j - 2] == 1 && chessState[i + 3, j - 3] == 1 && chessState[i + 4, j - 4] == 1)
    						{
    							flag = 1;
    							return flag;
    						}
    					}
    
    				}
    			}
    			for (int i = 11; i < 15; i++) 
    			{
    				for (int j = 0; j < 11; j++) 
    				{
    					//只需要判断横向  
    					if (chessState[i, j] == 1 && chessState[i, j + 1] == 1 && chessState[i, j + 2] == 1 && chessState[i, j + 3] == 1 && chessState[i, j + 4] == 1)  
    					{  
    						flag = 1;  
    						return flag;  
    					}  
    				}
    			}
    		}
    		//如果当前该黑棋落子,标定白棋刚刚下完一步,此时应该判断白棋是否获胜
    		else if(chessTurn == turn.black)
    		{
    			for (int i = 0; i < 11; i++)
    			{
    				for (int j = 0; j < 15; j++)
    				{
    					if (j < 4)
    					{
    						//横向
    						if (chessState[i, j] == -1 && chessState[i, j + 1] == -1 && chessState[i, j + 2] == -1 && chessState[i, j + 3] == -1 && chessState[i, j + 4] == -1)
    						{
    							flag = -1;
    							return flag;
    						}
    						//纵向
    						if (chessState[i, j] == -1 && chessState[i + 1, j] == -1 && chessState[i + 2, j] == -1 && chessState[i + 3, j] == -1 && chessState[i + 4, j] == -1)
    						{
    							flag = -1;
    							return flag;
    						}
    						//右斜线
    						if (chessState[i, j] == -1 && chessState[i + 1, j + 1] == -1 && chessState[i + 2, j + 2] == -1 && chessState[i + 3, j + 3] == -1 && chessState[i + 4, j + 4] == -1)
    						{
    							flag = -1;
    							return flag;
    						}
    						//左斜线
    						//if (chessState[i, j] == -1 && chessState[i + 1, j - 1] == -1 && chessState[i + 2, j - 2] == -1 && chessState[i + 3, j - 3] == -1 && chessState[i + 4, j - 4] == -1)
    						//{
    						//    flag = -1;
    						//    return flag;
    						//}
    					}
    					else if (j >= 4 && j < 11)
    					{
    						//横向
    						if (chessState[i, j] == -1 && chessState[i, j + 1] == -1 && chessState[i, j + 2] == -1 && chessState[i, j + 3] == -1 && chessState[i, j + 4] ==- 1)
    						{
    							flag = -1;
    							return flag;
    						}
    						//纵向
    						if (chessState[i, j] == -1 && chessState[i + 1, j] == -1 && chessState[i + 2, j] == -1 && chessState[i + 3, j] == -1 && chessState[i + 4, j] == -1)
    						{
    							flag = -1;
    							return flag;
    						}
    						//右斜线
    						if (chessState[i, j] == -1 && chessState[i + 1, j + 1] == -1 && chessState[i + 2, j + 2] == -1 && chessState[i + 3, j + 3] == -1 && chessState[i + 4, j + 4] == -1)
    						{
    							flag = -1;
    							return flag;
    						}
    						//左斜线
    						if (chessState[i, j] == -1 && chessState[i + 1, j - 1] == -1 && chessState[i + 2, j - 2] == -1 && chessState[i + 3, j - 3] == -1 && chessState[i + 4, j - 4] == -1)
    						{
    							flag = -1;
    							return flag;
    						}
    					}
    					else
    					{
    						//横向
    						//if (chessState[i, j] == -1 && chessState[i, j + 1] ==- 1 && chessState[i, j + 2] == -1 && chessState[i, j + 3] == -1 && chessState[i, j + 4] == -1)
    						//{
    						//    flag = -1;
    						//    return flag;
    						//}
    						//纵向
    						if (chessState[i, j] == -1 && chessState[i + 1, j] ==- 1 && chessState[i + 2, j] ==- 1 && chessState[i + 3, j] ==- 1 && chessState[i + 4, j] == -1)
    						{
    							flag = -1;
    							return flag;
    						}
    						//右斜线
    						//if (chessState[i, j] == -1 && chessState[i + 1, j + 1] == -1 && chessState[i + 2, j + 2] == -1 && chessState[i + 3, j + 3] == -1 && chessState[i + 4, j + 4] == -1)
    						//{
    						//    flag = -1;
    						//    return flag;
    						//}
    						//左斜线
    						if (chessState[i, j] == -1 && chessState[i + 1, j - 1] == -1 && chessState[i + 2, j - 2] == -1 && chessState[i + 3, j - 3] == -1 && chessState[i + 4, j - 4] == -1)
    						{
    							flag = -1;
    							return flag;
    						}
    					}
    				}
    			}
    			for (int i = 11; i < 15; i++) 
    			{
    				for (int j = 0; j < 11; j++) 
    				{
    					//只需要判断横向  
    					if (chessState[i, j] == -1 && chessState[i, j + 1] == -1 && chessState[i, j + 2] == -1 && chessState[i, j + 3] == -1 && chessState[i, j + 4] == -1)  
    					{  
    						flag = -1;  
    						return flag;  
    					}  
    				}
    			}
    		}       
    		return flag;
    	}    
    }



    运行效果截图:



    小结

    本程序实现了五子棋的基本功能,纯属娱乐而作。暂时没有加入各种UI、网络模块等。本程序经过了简单的测试,没有什么问题,如果大家在使用的时候发现有什么Bug,请联系我改正,谢谢。

    *************************************************************************************

    下面是工程源码下载地址:

    https://github.com/zzlyw/FiveChess_Tutorial



    展开全文
  • 在网页中交互unity3d

    2013-12-05 11:25:07
    1、在unity3d调用网页js函数  如果在html中有脚本函数,则在unity3d中我们可以使用Application.ExternalCall调用js函数,改方法只适合在web3D环境下使用。 该方法支持基本类型的传递和数组传递,任何类型都会转换...

    1、在unity3d中调用网页js函数

           如果在html中有脚本函数,则在unity3d中我们可以使用Application.ExternalCall调用js函数,改方法只适合在web3D环境下使用。

    该方法支持基本类型的传递和数组传递,任何类型都会转换成字符串类型使用。


    例子代码

            Application.ExternalCall("SayHello","hello world");    //调用SayHello,传递一个字符串


    2、在网页脚本中调用unity3d函数

            <script type="text/javascript">
            <!--
                 var unityObjectUrl = "http://wp-china.unity3d.com/download_webplayer-3.x/3.0/uo/UnityObject2.js";
                 if (document.location.protocol == 'https:')
                 unityObjectUrl = unityObjectUrl.replace("http://", "https://ssl-");
                 document.write('<script type="text\/javascript" src="' + unityObjectUrl + '"><\/script>');
            -->
            </script>


    <script type="text/javascript">
            <!--
                var config = {
                    width: 960,
                    height: 600,
                    params: { enableDebugging:"0", disableContextMenu: true,            
                    logoimage: "__ROOT__/3D/3D_Login.png",
                 progressbarimage: "__ROOT__/3D/front.png",
                 progressframeimage: "__ROOT__/3D/black.png",
             baseDownloadUrl: "http://wp-china.unity3d.com/download_webplayer-3.x/",
             autoupdateURL : "http://wp-china.unity3d.com/autodownload_webplugin-3.x",
             autoupdateURLSignature : "02a5f78b3066d7d31fb063186a2eec36fdf1205d49c6b0808eb37ef85ed9902e2e1904d87f599238a802ba0abbfe4f18aa82dd2eb5171e99ba839a5cea9e6ea9c1be9eae505937b56fe4a5fd254cffe08958d961f42d970136b5eab9e6c2cd08b81bc8a11e5ade57dc63dcfef2248d89689e4d4feed3cdfe7374c848fd57ebd4"
                    }
                    
                };
                var u = new UnityObject2(config);

                jQuery(function() {

                    var $missingScreen = jQuery("#unityPlayer").find(".missing");
                    var $brokenScreen = jQuery("#unityPlayer").find(".broken");
                    $missingScreen.hide();
                    $brokenScreen.hide();
                    
                    u.observeProgress(function (progress) {
                        switch(progress.pluginStatus) {
                            case "broken":
                                $brokenScreen.find("a").click(function (e) {
                                    e.stopPropagation();
                                    e.preventDefault();
                                    u.installPlugin();
                                    return false;
                                });
                                $brokenScreen.show();
                            break;
                            case "missing":
                                $missingScreen.find("a").click(function (e) {
                                    e.stopPropagation();
                                    e.preventDefault();
                                    u.installPlugin();
                                    return false;
                                });
                                $missingScreen.show();
                            break;
                            case "installed":
                                $missingScreen.remove();
                            break;
                            case "first":
                            break;
                        }
                    });
                    u.initPlugin(jQuery("#unityPlayer")[0], "__ROOT__/3D/myUnity.unity3d");
                });
            -->


    function State(msg) {
                
                    if (msg == "ok") {
                        
                        var result;
                        
                        if(username==""||userpass=="")
                            result = "";
                        else
                            result = username + "|" + userpass;
                        var senceresult = oldSenceName + "|" + SenceName;
                        var page = myPage;

                        //alert("用户名密码:" + result + "场景:" + senceresult + "来源" +page)
                        u.getUnity().SendMessage("Login", "LoginSenceFromWebpage", senceresult);
                        u.getUnity().SendMessage("Login", "LoginFromWebpage", result);
                        u.getUnity().SendMessage("Login", "LoginYesOrNoFromWebpage", page);
                    }
                }
            </script>


    <div id="unityPlayer">
                <div class="missing"> <a href="http://unity3d.com/webplayer/" title="Unity Web Player. Install now!"> <img alt="Unity Web Player. Install now!" src="http://wp-china.unity3d.com/installation/getunity.png" width="193" height="63" /> </a>
                </div>
                <div class="broken"> <a href="http://unity3d.com/webplayer/" title="Unity Web Player. Install now! Restart your browser after install."> <img alt="Unity Web Player. Install now! Restart your browser after install." src="http://wp-china.unity3d.com/installation/getunityrestart.png" width="193" height="63" /> </a>
                </div>
          </div>

    展开全文
  • 如果拿Unity3D制作2D游戏,由于Unity3D不接受GIF动画,所以动画要按照最原始的游戏制作方式,利用序列帧大图完成。在《【Photoshop】合并一系列序列帧图片成序列帧大图》(点击打开链接)中,我曾经提到如何用常用的...
  • unity3d 调用windows窗口

    2016-02-14 13:32:05
    1 编辑模式(Editor)下:string path = EditorUtility.OpenFilePanel("Load png Textures of Directory", "", ""); WWW ww=new WWW("file:///"+path); print(ww.url); yield return ww; gui.texture=ww.texture; 2...
  • 各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/...比如博主在写《[Unity3D]Unity3D游戏开发之自由视角下的角色控制》和《[Unity3D]Unity3D游戏开发之角色控制漫谈》这两篇
  • 【前言】 图形化调试可以加速开发。 例如在战斗中,可能需要知道所有单位的仇恨值,如果这些信息全打log的话,很难有...Unity中图形化调试主要4种 Debug.Draw Gizmos.Draw Graphic.DrawMesh GL 只需在Scene窗口显示的
  • 解决unity3D中使用OpenFileDialog报错的问题。实现unity3D打开资源管理器选择本地图片并显示。
  • 此篇博文解决的问题是:  1、unity3d如何访问android SD卡的文件  2、如果把android端代码以jar包形式由unity3d调用 ... 实现效果是unity3d调用android相册或相机,选择一张图片剪裁后,将图片肯绘制到unity3d中。
  • 整体如图所示,白色的平面是raw image,摄像头的代码要托到它上面,熊猫就是file,为fbx格式的文件,它和贴图文件(这里是dds文件,一般为图片文件如png等)直接拖进到assets窗口即可,主摄像机不用设置,默认即可。...
  • 环境:Unity4.6.2 Win7 64bit我这里一张图片就是一帧,不需要去把一张图片裁剪成几段。然后把这些png图片按顺序渲染。其实这样也可以用视频来代替,也可以有同样的效果。 实际操作其实是很简单的,先将图片导入...
  • Unity3D常用知识点总结

    2020-06-18 10:29:01
    Unity3D 可以通过将游戏中的物体拖入新键文件夹来重复使用(往往包括该物体用到的模型,动画,贴图,脚本等等) 右上可以调整Debug还是Normal模式 物体 unity3d下 常用物体 cube cylinder sphere plane quad ...
  • 编写时无法调用Input,时因为安装的时候少了某些东西还是要在最上方加几条Using语句呢? ![图片说明](https://img-ask.csdn.net/upload/202006/10/1591772710_97784.png) 找了一些解决方案以后,我突然发现我的...
  • 最近在做项目的过程中遇到这样的一个需求:玩家可以在游戏过程中进行实时存档,在...首先是截取游戏画面,这个问题大家可以在《Unity3D游戏开发之截屏保存精彩瞬间》这篇文章中找到答案。其次是从本地加载图片,因为这
  • Unity3d截图保存到Android相册的实现-----------------------------ultrasoon 季风原创--------------------------------------- 1.Unity3d场景中先加入屏幕抓图功能: Application.CaptureScreenshot(...
  • using UnityEngine; using System.Collections; using System; using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] ...public class OpenFileName ...
  • Unity3d调用system.windows.forms.dll使用OpenFileDialog打开文件选择窗口
  • 比如到UnityAssetStore买了一个PolygonCity的asset资源,打开里面的Demo.scene。...脚本参考了《Unity3D研究院之将场景导出XML或JSON或二进制并且解析还原场景(四十二)》http://www.xuanyusong....
  • 博主本来想自己写,有大大写的异常详细...在Unity3D中使用三维模型,主要依靠Mesh Filter组件载入多边形表面物体(polygon mesh),然后依靠Mesh Renderer组件将Mesh正确渲染出来。 内置基本3D模型 Unity3D内置有...
1 2 3 4 5 ... 20
收藏数 1,768
精华内容 707
关键字:

png调用 unity3d