2017-03-07 00:22:50 marvelgl 阅读数 412
• 深入浅出Unity3D——第一篇

Unity3D基础知识、游戏算法一网打尽。

76329 人正在学习 去看看 何韬

``````using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TicTacToe: MonoBehaviour {
int turn = 1;
int [,]state = new int[3,3];
void Start () {
Reset();
}

void Update () { }

void OnGUI() {
if (GUI.Button(new Rect(0,0,150,50), "Start Game")) {
Reset();
}
int current = Check();
if (current == 1) GUI.Label(new Rect(50,55,50,50),"O wins!");
if (current == 2) GUI.Label(new Rect(50,55,50,50),"X wins!");
if (current == 3) GUI.Label(new Rect(50,55,50,50),"Tied!");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (state[i, j] == 1) {
GUI.Button(new Rect(0+50*i,80+50*j,50,50), "O");
} else if (state[i, j] == 2) {
GUI.Button(new Rect(0+50*i,80+50*j,50,50), "X");
}
if (GUI.Button(new Rect(0+50*i,80+50*j,50,50), "")) {
if (current == 0) {
if (turn == 1) state[i, j] = 1;
if (turn == -1) state[i, j] = 2;
turn *= -1;
}
}
}
}
}

int Check() {
for (int i = 0; i < 3; i++) {
if (state[i, 0] == state[i, 1] && state[i, 0] == state[i, 2] && state[i, 0] != 0) {
return state[i, 0];
}
}

for (int j = 0; j < 3; j++) {
if (state[0, j] == state[1, j] && state[2, j] == state[0, j] && state[0, j] != 0) {
return state[0, j];
}
}

if (state[1, 1] != 0 && state[0, 0] == state[1, 1] && state[2, 2] == state[1, 1]) {
return state[1, 1];
}

if (state[1, 1] != 0 && state[0, 2] == state[1, 1] && state[2, 0] == state[1, 1]) {
return state[1, 1];
}

for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (state[i, j] == 0) return 0;
}
}

return 3;
}

void Reset() {
turn = 1;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
state[i, j] = 0;
}
}
}
}
``````

unity3d 点击重叠 相关内容

2018-12-28 23:22:26 lydcsdn 阅读数 353
• 深入浅出Unity3D——第一篇

Unity3D基础知识、游戏算法一网打尽。

76329 人正在学习 去看看 何韬

需要实现的功能

``````// An highlighted block
//建立主摄像机到鼠标点击位置的射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//建立碰撞信息数组
RaycastHit[] hitInfo;
//发出射线
hitInfo = Physics.RaycastAll(ray, 1000);
//选取数组中第一个元素作为被鼠标点选的物体
if(hitInfo>0)
GameObject GetObj=hitInfo[0].collider.gameobject;
``````

遇到的问题

RaycastHit[] hitInfo;

解决问题

``````//设置一个绝对大于摄像机到所有物体距离的距离值
float minidis = 10000;
GameObject GetObj=new GameObject()；
for (int i=0;i< hitInfo.Length;i++)
{
if (hitInfo[i].distance < minidis)
{
GetObj = hitInfo[i].collider.gameobject;
minidis = hitInfo[i].distance;
}
}
``````

unity3d 点击重叠 相关内容

2020-03-23 11:01:05 qq_37760273 阅读数 13
• 深入浅出Unity3D——第一篇

Unity3D基础知识、游戏算法一网打尽。

76329 人正在学习 去看看 何韬

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class ClickMouse : MonoBehaviour
{
private int _index;
private GraphicRaycaster _raycaster;
// Start is called before the first frame update
void Start()
{
_raycaster = FindObjectOfType<GraphicRaycaster>();
}

private void OnMouseDown()
{
//ChangeColor();
if (!IsUI())
{
ChangeColor();
}
}

void ChangeColor()
{
if (_index == 0)
{
GetComponent<MeshRenderer>().material.SetColor("_Color", Color.black);
}
else
{
GetComponent<MeshRenderer>().material.SetColor("_Color", Color.white);
}
_index = _index == 0 ? 1 : 0;
}

private bool IsUI()
{
PointerEventData data = new PointerEventData(EventSystem.current);
data.pressPosition = Input.mousePosition;
data.position = Input.mousePosition;

List<RaycastResult> results = new List<RaycastResult>();
_raycaster.Raycast(data, results);
return results.Count > 0;
}
}

unity3d 点击重叠 相关内容

2015-05-27 10:26:50 hasion 阅读数 3597
• 深入浅出Unity3D——第一篇

Unity3D基础知识、游戏算法一网打尽。

76329 人正在学习 去看看 何韬

在Unity5.0之后，NGUI的导入多少回带入一些错误，很多都是组件的问题，在unity4.6的时候，NGUI还是可以用的，不过现在ngui就显得越来越多余了，更多的人会去选择UGUI去搭建自己的UI。

在新的UI系统下，因为UI和3D物体都是在一个相机下渲染的，这样就出现UI上的点击和3D物体的点击冲突问题。当UI和3D问题重叠是，如何去判别呢。这边集合自己搜集的资料以及自己的想法。整理如下：

```using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class point : MonoBehaviour {

void Update()
{
if (Input.GetMouseButtonDown(0))
{

if (EventSystem.current.IsPointerOverGameObject())
{
print("在UI上");
}
else
{
print("不在UI上");
}
}
}

}
```

1、先给相机添加PhysicsRaycaster组件：

2、在一个UI和3D的共存的场景中，添加相应的想要对3D物体操作的脚本到3D物体上。EventSystem 所有能在UI上添加的事件都可以用在3D物体，具体有哪些方法可以查看官方api。下面我以拖拽3D物体为例，代码比较简单，就不注释了，

```using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class ObjCheck : MonoBehaviour ,IBeginDragHandler,IDragHandler
{
public void OnBeginDrag(PointerEventData eventData)
{
print(eventData.pointerDrag.name);
}

public void OnDrag(PointerEventData eventData)
{
Vector3 worldPos;
Vector3 screenpos = Camera.main.WorldToScreenPoint(transform.position);

worldPos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenpos.z));

transform.position = worldPos;

}

}
```

unity3d 点击重叠 相关内容

2016-11-25 16:00:54 mseol 阅读数 1747
• 深入浅出Unity3D——第一篇

Unity3D基础知识、游戏算法一网打尽。

76329 人正在学习 去看看 何韬

Unity中当使用了UnityEngine.Ray或Input.Touch，会遇到UI层和3D物体层重叠的问题。通过UnityEngine.EventSystems，可以检测UI点击，屏蔽3D Collider的干扰。

``````using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;

public class UIBlock : MonoBehaviour
{
void Update ()
{
if (EventSystem.current.IsPointerOverGameObject())
{
Debug.Log("是UI");
return;
}

if (Input.GetMouseButton(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;

if (Physics.Raycast(ray, out hit))
{
if (hit.transform.gameObject.tag != "Untagged")
{
Debug.Log(hit.transform.name);
}
}
}
}
}
``````

EventSystem.current.IsPointerOverGameObject() 括号内填写参数fingerId，不填默认指向左键。这个方法用于在移动端上处理以上问题。

``````using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;

public class TouchExample : MonoBehaviour
{
void Update()
{
// Check if there is a touch
if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
{
// Check if finger is over a UI element
if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
{
Debug.Log("Touched the UI");
}
}
}
}``````

unity3d 点击重叠 相关内容