using UnityEngine;

using System.Collections;

using System.Collections.Generic;

public class Gem : MonoBehaviour {

public GameObject sphere;

public GameObject selector;

public List<Gem> Near = new List<Gem>();

public string[] gemMaterials = {"Red", "Blue", "Green", "Orange", "Yellow", "Black", "Purple"} ;

public string color = "";

public bool isSelected = false;

public bool isMatched = false;

public int XCoord{

get

{

return Mathf.RoundToInt(transform.localPosition.x);

}

}

public int YCoord{

get

{

return Mathf.RoundToInt(transform.localPosition.y);

}

}

// Use this for initialization

void Start () {

CreateGem();

}

// Update is called once per frame

void Update () {

}

public void ToggleSeletor(){

isSelected = !isSelected;

selector.SetActive(isSelected);

}

public void CreateGem(){

color = gemMaterials[Random.Range(0, gemMaterials.Length - 1)];

print (gemMaterials.Length);

Material m= Resources.Load("Materials/"+color) as Material;

sphere.renderer.material = m;

print (color);

print (m);

print (sphere.renderer.material);

isMatched = false;

}

public void AddNear(Gem g)

{

if(!Near.Contains(g))

Near.Add(g);

}

public bool IsNearWith(Gem g)

{

if(Near.Contains(g))

{

return true;

}

return false;

}

public void RemoveNear(Gem g)

{

Near.Remove(g);

}

void OnMouseDown()

{

if(!GameObject.Find("Board").GetComponent<Board>().isSwapping)

{

ToggleSeletor();

GameObject.Find("Board").GetComponent<Board>().SwapGem(this);

}

}

}

////////////////////////////////////////////////////////////////////////////////////////////


using UnityEngine;

using System.Collections;

using System.Collections.Generic;

public class Board : MonoBehaviour {

public List<Gem> gems = new List<Gem>();

public int GridWidth;

public int GridHeight;

public GameObject gemPrefabs;

public Gem lastGem;

public Vector3 gem1Start,gem1End,gem2Start,gem2End;

public bool isSwapping = false;

public Gem gem1, gem2;

public float startTimer;

public float swapRate = 3f;

public int AmountToMatch = 3;

public bool isMatched = false;

// Use this for initialization

void Start () {

for(int y = 0; y < GridHeight; y++)

{

for(int x = 0; x < GridWidth; x++)

{

GameObject g = Instantiate(gemPrefabs,new Vector3(x, y, 0), Quaternion.identity) as GameObject;

g.transform.parent = gameObject.transform;

gems.Add(g.GetComponent<Gem>());

}

}

gameObject.transform.position = new Vector3(-2.5f, -2f, 0);

}

public void TogglesPhysics(bool isOn)

{

for(int i = 0; i <gems.Count; i++)

{

gems[i].rigidbody.isKinematic = isOn;

}

}

public void SwapGem(Gem currentGem){

if(lastGem == null){

lastGem = currentGem;

}

else if(lastGem == currentGem){

lastGem = null;

}

else{

if(lastGem.IsNearWith(currentGem))

{

gem1Start = lastGem.transform.position;

gem1End = currentGem.transform.position;

gem2Start = currentGem.transform.position;

gem2End = lastGem.transform.position;

startTimer = Time.time;

TogglesPhysics(true);

gem1 = lastGem;

gem2 = currentGem;

isSwapping = true;

}

else

{

lastGem.ToggleSeletor();

lastGem = currentGem;

}

}

}

// Update is called once per frame

void Update () {

if(isMatched)

{

for(int i = 0; i < gems.Count; i++)

{

if(gems[i].isMatched)

{

gems[i].CreateGem();

gems[i].transform.position= new Vector3(gems[i].transform.position.x, gems[i].transform.position.y + 6, gems[i].transform.position.z);

}

}

}

isMatched = false;

if(isSwapping){

MoveGem(gem1, gem1End, gem1Start);

MoveNegGem(gem2, gem2End, gem2Start);

if(Vector3.Distance(gem1.transform.position, gem1End) <= .1f || Vector3.Distance(gem2.transform.position, gem2End) < .1f){

gem1.transform.position = gem1End;

gem2.transform.position = gem2End;

gem1.ToggleSeletor();

gem2.ToggleSeletor();

lastGem = null;

isSwapping = false;

TogglesPhysics(true);

CheckMatch();

}

}

}

public void CheckMatch(){

List<Gem> gem1List = new List<Gem>();

List<Gem> gem2List = new List<Gem>();

ConstructMatchList(gem1.color, gem1, gem1.XCoord, gem1.YCoord, ref gem1List);

FixedMatchList(gem1, gem1List);

ConstructMatchList(gem2.color, gem2, gem1.XCoord, gem2.YCoord, ref gem2List);

FixedMatchList(gem2, gem2List);

print("gem1" + gem1List.Count);

}

public void ConstructMatchList(string color, Gem gem, int XCoord, int YCoord, ref List<Gem> MatchList){

if(gem == null)

{

return;

}

else if(gem.color != color)

{

return;

}

else if(MatchList.Contains(gem))

{

return;

}

else{

MatchList.Add(gem);

if(XCoord == gem.XCoord || YCoord == gem.YCoord)

{

foreach(Gem g in gem.Near)

{

ConstructMatchList(color, g, XCoord, YCoord, ref MatchList);

}

}

}

}

public void FixedMatchList(Gem gem, List<Gem> ListToFix){

List<Gem> rows  = new List<Gem>();

List<Gem> collumns = new List<Gem>();

for(int i = 0; i < ListToFix.Count; i++)

{

if(gem.XCoord == ListToFix[i].XCoord)

{

rows.Add(ListToFix[i]);

}

if(gem.YCoord == ListToFix[i].YCoord)

{

collumns.Add(ListToFix[i]);

}

}

if(rows.Count >= AmountToMatch)

{

isMatched = false;

for(int i = 0; i < rows.Count; i++){

rows[i].isMatched = true;

}

}

if(collumns.Count >= AmountToMatch)

{

isMatched = true;

for(int i = 0; i < collumns.Count; i++){

collumns[i].isMatched = true;

}

}

}

public void MoveGem(Gem gemToMove, Vector3 toPos, Vector3 fromPos)

{

Vector3 center = (fromPos + toPos) * .5f;

center -= new Vector3(0.0f, .1f);

Vector3 riseCenter = fromPos - center;

Vector3 setCenter = toPos - center;

float fracComplete = (Time.time - startTimer)/swapRate;

gemToMove.transform.position = Vector3.Slerp(riseCenter, setCenter, fracComplete);

gemToMove.transform.position += center;

}

public void MoveNegGem(Gem gemToMove, Vector3 toPos, Vector3 fromPos){

}

}


'Computer Language > 유니티' 카테고리의 다른 글

Hexa  (0) 2014.11.25
3인칭 시점  (0) 2014.11.13
사인과 코사인 응용 방안  (0) 2014.11.12
Dialog() 다이아로그  (0) 2014.11.10
더미와 다이어로그  (0) 2014.11.10

+ Recent posts