Archive for the ‘C#’ Category

ASP.NET 数据库(SQL SERVER)操作的最简Demo

星期一, 九月 2nd, 2013 148 views

首先创建一个数据库操作基类DB.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
using System.Security.Cryptography;
/// <summary>
///DB 的摘要说明
/// </summary>
public class DB
{
    public static string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
    public DB(){}

    /// <summary>
    ///创建连接
    /// </summary>
    public SqlConnection GetConnection()
    {
        return new SqlConnection(connectionString);
    }

    /// <summary>
    ///执行语句并返回行数
    /// </summary>

 <a href="http://coder.beitown.com/archives/1014#more-1014" class="more-link">(更多...)</a>

Unity3D-FSM有限状态机的简单设计

星期三, 三月 13th, 2013 3,725 views

在之前的文章里介绍了一个基础U3D状态机框架(Unity3D游戏开发之状态流框架)即大Switch的枚举状态控制。这种方法虽然容易理解,编程方法也相对简单,但是弊端是当状态变得复杂之后,或需要添加一种新的状态时,会显得非常混乱并且难以下手。故我们需要引进一种更高级的状态机技术来避免这些问题。网上有一些讲述U3D-FSM状态机的文章,但都不针对基础讲解,而且大多带有冗余的与状态机不相关的代码,基础不好的读者容易看不清FSM状态机的核心所在。这里针对网上的一些文章和代码做了一个整理,意图使之简单易懂。

这里关于FSM有限状态机这类名词的解释这里就不再说明了,感兴趣的朋友可以自己去百度下(度娘链接),本文只说重点。

首先是状态机基类State.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
 * 状态基类
 */

public class State[entity_type>
{
    public entity_type Target;
    //Enter state  
    public virtual void Enter (entity_type entityType)
    {
       
    }
    //Execute state
    public virtual void Execute (entity_type entityType)
    {
       
    }
    //Exit state
    public virtual void Exit (entity_type entityType)
    {
       
    }

}

基类之所以设计成含有3个小的状态方法是因为,通常在游戏中有些行为都只是在进入或退出某个状态时出现的,并不会发生在通常的更新步骤中。这样设计就可以有效的将持续性调用语句和一次性调用语句有效的区分开来。(举例:发送技能时的特效,有些是持续性而有些又是一次性的)

接下来我们编写状态机代码,来使直接的这个基类的各个方法运作起来:
(更多…)

Unity3D协程闭包事件执行定时器

星期一, 三月 11th, 2013 549 views

介于U3D没有一个自带的事件执行定时器,所以打算自己动手做一个,基本思路如下,先用伪代码来写了

1
2
3
4
5
6
void timer(int time,Func func){

wait(time);//等待N秒
func();//执行传入的函数

}

最开始的思路是用闭包加线程来实现,之后和群里的朋友讨论了下,经过提示其实可以避免去碰线程这种bug多发产物,取而代之的是U3D包里自带的一个协程MonoBehaviour.StartCoroutine

先来完善下我们的事件定时器,惯例直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using UnityEngine;
using System.Collections;
using System;

public class EventTimer : MonoBehaviour {


    public IEnumerator Timer(float waitTime , Func[bool> func)
    {
        yield return new WaitForSeconds(waitTime);
        func();
   
    }

}

(更多…)

在C#调用DLL包(U3D同理)

星期四, 十二月 13th, 2012 70 views

本文简单说明一下如何在Unity3D中调用一个DLL包,用法和C#调用一个DLL包一样,由于比较简单这里就直接上代码吧

1
2
3
4
5
[DllImport("DLLNAME")]//DLLNAME为dll包的名字,不需要加.dll后缀
static extern void TestFun1();//定义一个DLL包中的方法TestFun1
[DllImport("DLLNAME")]
static extern void TestFun2();//定义一个DLL包中的方法TestFun2
...

之后在代码中直接调用TestFun1() 和正常的C#函数一样使用即可
关于DLL包的放置位置,如果是C#中,和.exe执行文件同一个目录下即可
在Unity中应将DLL文件放置在 Assets\Plugins 文件夹下,没有就自己创建一个
就说到这里吧,本文意在分享,欢迎指着交流

BeiTown
2012.12.13

C#获取硬盘序列号

星期二, 十二月 11th, 2012 103 views

本来准备直接用在U3D里的,但是无奈游戏程序一加载到该模块就完全崩溃,目前原因不明,有可能是该部分功能已经超越Unity的权限范围,不过独立的C#版本是可用的,这里先把代码发上来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System.Management;//导入此命名空间
/**
* 该函数返回存有硬盘序列号的字符串
**/

private string GetDiskSerial()
        {
            try
            {
                ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");
                String strHardDiskID = "nothing found!";
                foreach (ManagementObject mo in searcher.Get())
                {
                    strHardDiskID = mo["SerialNumber"].ToString().Trim();
                    break;
                }
                return strHardDiskID;
            }
            catch
            {
                return "nothing found!";
            }
        }

基本原理就是调用API去与硬件底层交互
不过测试之后发现有些时候并不能获取到硬盘序列号
所以又有了第二种方法,代码如下
(更多…)