Google Code Prettify

2014年7月6日 星期日

[心得]用Unity+NGUI做一個井字遊戲

一直想要做一個簡單遊戲的系列文章 本來是想等新的UI系統出來再寫~
不過因為各種原因就用NGUI做了一個~ 等新UI出來在做一個看看
 A.邏輯部分 用一個2維陣列,對應到每個格子,格子空著0分,
在格子裡面畫O就給1分,畫X給-1分。 用迴圈跑一次橫排,
跑一次直排,算兩個對角線的分數。 如果其中一條是3分,
就是O勝利。 如果其中一條是-3分,就是X勝利。

    void CheckWin()
 {
  int pSum =0 ;
  for(int i=0 ; i<3 ;i++)
  {
   pSum =0;
   for(int j=0 ; j<3 ; j++)
   {
    pSum += GameArray[i,j];
   }
   if(pSum == m_CheckNumber)
   {
    isFinish =true;
    m_labelText.text = "o win,V"+playa;
   }
   
   if(pSum == m_CheckNumber*-1)
   {
    isFinish =true;
    m_labelText.text = "V win,O"+playB;
   }
  }
  if(isFinish == false)
  {
   for( int i=0 ; i<3 ;i++)
   {
    pSum =0 ;
    for( int j=0 ; j<3 ; j++)
    {
     pSum += GameArray[j,i];
    }
    if(pSum == m_CheckNumber)
    {
     isFinish =true;
     m_labelText.text = "o win,V"+playa;
    }
    
    if(pSum == m_CheckNumber*-1)
    {
     isFinish =true;
     m_labelText.text = "V win,O"+playB;
    }
   }
  }

  if(isFinish == false)
  {
   pSum =0 ;   
   pSum = GameArray[0,0]+GameArray[1,1]+GameArray[2,2];
   if(pSum == m_CheckNumber)
   {
    isFinish =true;
    m_labelText.text = "o win,V"+playa;
   }
   
   if(pSum == m_CheckNumber*-1)
   {
    isFinish =true;
    m_labelText.text = "V win,O"+playB;
   }
  }
  if(isFinish == false)
  {
   pSum =0 ;   
   pSum = GameArray[0,2]+GameArray[1,1]+GameArray[2,0];
   if(pSum == m_CheckNumber)
   {
    isFinish =true;
    m_labelText.text = "o win,V"+playa;
   }
   
   if(pSum == m_CheckNumber*-1)
   {
    isFinish =true;
    m_labelText.text = "V win,O"+playB;
   } 
  }
 }//void CheckWin()
B.顯示部分
做3張圖 分別是方格、圈圈和叉叉(PS 這邊用勾勾代替一下)  
將方格做成Button,滑鼠點擊的時候依照輪到的順序,顯示圈圈或是叉叉

    public void Click()
    {
 if(isFinish == true)
  return;
 UIButton btn = UIButton.current;
 int num = int.Parse(btn.name);
 int row =num/3;
 int col =num%3;
 GameObject go;
 if(GameArray[row ,col] ==0)
 {
  if(m_player == 1)
  {
    go =btn.transform.FindChild("IconO").gameObject;
   NGUITools.SetActive(go , true);
   m_player =2;
   GameArray[row ,col]=1;
  }
  else
  {
      go =btn.transform.FindChild("IconX").gameObject;
      NGUITools.SetActive(go , true);
      m_player =1;
      GameArray[row ,col]=-1;
  }  
  CheckWin();
 }
    }

2014年1月1日 星期三

Unity 與 委託(1)

之前公司寫UNITY是用 UNITY SCRIPT,專案越寫越大,總感覺有些不夠嚴謹。 下次專案預定改成C# C#有一個很好用的機制 delegate 就當作學習心得記錄下來 主程式 拖到場景的物件中

using UnityEngine;
using System.Collections;


public class test : MonoBehaviour {

 public delegate string ProcessDelegate(string s1, string s2);
 ProcessDelegate pd;

 // Use this for initialization
 void Start () {

  pd = new ProcessDelegate(new delegateEx1().Process);
            
 }
 
 // Update is called once per frame
 void Update () 
 {
  Debug.Log(pd("Hello", "World")); 
 }
}
code delegateEx1 如下

using UnityEngine;
using System.Collections;

public class delegateEx1  {

 public string Process(string s1,string s2)
 {
  return s1 + s2;
 }
}
結果會在 Console視窗中不斷顯示 HelloWorld 另一種調用的方式

using UnityEngine;
using System.Collections;


public class test : MonoBehaviour {
 public delegate string ProcessDelegate(string s1, string s2);

 ProcessDelegate pd;

 // Use this for initialization
 void Start () {

  //pd = new ProcessDelegate(new delegateEx1().Process);
  ReceiveDelegateArgsFunc(new ProcessDelegate(new delegateEx1().Process));
            
 }
 
 // Update is called once per frame
 void Update () 
 {
  //Debug.Log(pd("Hello", "World")); 
 }

 public void ReceiveDelegateArgsFunc(ProcessDelegate func)
 {
  string str = func("good","test");   
  Debug.Log(str);
 }

}
結果會在 Console視窗中顯示 goodtest

2013年12月12日 星期四

(轉)

Unity 匯入一個有動作的角色,設定位置後仍在原地動。
原因是因為Animator的Apply Root Motion被打勾,所以才在原地動。
GameObject gobj = Instantiate(Walker, new Vector3(vecWalker.x, 0, vecWalker.y), Quaternion.identity) as GameObject;
  gobj.transform.parent = friendLayer.transform;

轉自 

akira32 編程之家 Yahoo

2013年11月19日 星期二

對軸心旋轉

準備任意張圖,各自做成物件,在做一個要當作軸心的物件(或是用空物件代替),並將CODE貼到空物件上。


#pragma strict

var tex:GameObject[] = new GameObject[5];
var speed:int = 40;

function Start () {

for(var i:int =0 ; i {
var x;
var y;
//圆点坐标:(x0,y0)
//半径:r
//角度:a0
//则圆上任一点为:(x1,y1)
//x1   =   x0   +   r   *   cos(ao   *   3.14   /180   )
//y1   =   y0   +   r   *   sin(ao   *   3.14   /180   )

x= 0+ 3*Mathf.Cos(i*72 * 3.14/180);
y= 0+ 3*Mathf.Sin(i*72 * 3.14/180);

tex[i].transform.position = Vector3(x,0,y);

}
}

function Update () {

tex[0].transform.RotateAround(this.transform.position, Vector3.up, speed * Time.deltaTime);
tex[0].transform.LookAt(this.transform);
tex[1].transform.RotateAround(this.transform.position, Vector3.up, speed * Time.deltaTime);
tex[1].transform.LookAt(this.transform);
tex[2].transform.RotateAround(this.transform.position, Vector3.up, speed * Time.deltaTime);
tex[2].transform.LookAt(this.transform);
tex[3].transform.RotateAround(this.transform.position, Vector3.up, speed * Time.deltaTime);
tex[3].transform.LookAt(this.transform);
tex[4].transform.RotateAround(this.transform.position, Vector3.up, speed * Time.deltaTime);
tex[4].transform.LookAt(this.transform);

}

===============================================================
成果
 物件就會對著設定的軸心(在這裡是空物件)做旋轉了。








2013年11月16日 星期六

unity點擊特效

最近同事提到有的遊戲點下去就會出現一個類似水波的效果,問說要怎麼實現。回家就稍微做了一下。

準備一個特效(會自動銷毀的特效),把SCRIPT放到鏡頭上,並且把特效拖到MyEffect上

#pragma strict
//effect
var MyEffect:GameObject ;
var hit : RaycastHit;
var cooldown : float;
private var effect:GameObject;
private var g_camera : Camera;
private var g_camTransform : Transform;

function Awake()
{
   g_camera = Camera.main;
   g_camTransform = g_camera.transform;
}

function Update ()
{
if(cooldown>0){cooldown-=Time.deltaTime;}
var mousePos = Input.mousePosition;

var ray = Camera.main.ScreenPointToRay (Input.mousePosition);
var vecMousePosition = g_camera.ScreenToWorldPoint(Vector3(mousePos.x, mousePos.y,1));
if(Input.GetMouseButton(0) &&cooldown<=0)
{
                 //生成特效
effect=Instantiate(MyEffect, vecMousePosition , Quaternion.identity);
cooldown=0.15;
}
}




=================================================
成果
 OK 這樣子點擊的時候就會出現特效了。
範例



2013年11月14日 星期四

Unity Shader學習筆記(1)

最近看著書學寫Unity的Shader,順便寫一下筆記
兩個顏色混合

Shader "Custom/ex1" {
Properties {
_EmissiveColor ("ColorA", Color) = (1,1,1,1)
_AmbientColor ("ColorB", Color) = (1,1,1,1)
_PowerValue ("Power", Range(0,10)) = 2.5
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200

CGPROGRAM
#pragma surface surf Lambert

float4 _EmissiveColor;
float4 _AmbientColor;
float _PowerValue ;

struct Input {
float2 uv_MainTex;
};

void surf (Input IN, inout SurfaceOutput o) {
float4 c;
c = pow((_EmissiveColor + _AmbientColor), _PowerValue );
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}


=============================================================
成果


2011年4月23日 星期六

#define 用法

在書上都會看到一些 #define的用法
但是通常都很短
但是再寫WINDOWS程式的時候
常會看到 以下這種寫法

#define CreateWindowA(lpClassName, lpWindowName, dwStyle, x, y,\ nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\ CreateWindowExA(0L, lpClassName, lpWindowName, dwStyle, x, y,\ nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)


所以上網查了一下 原來 #define 有多行的用法

3.define的多行定義
define可以替代多行的代碼,例如MFC中的宏定義(非常的經典,雖然讓人看了噁心)
#define MACRO(arg1, arg2) do { \
/* declarations */ \
stmt1; \
stmt2; \
/* . .. */ \
} while(0) /* (no trailing ; ) */
關鍵是要在每一個換行的時候加上一個"\