抄袭参考文章: 学长博客

Unity hub文件:Assets文件夹

简答题传输门:简答题部分

本次作业基本是看着学长的博客实现的,不过我太菜了,照着抄都跑不动,初次使用unity做游戏,踩了很多坑。代码跟传送门都在上面,在此我就跟大家聊一聊坑点和我的改进。

我主要是在给井字棋多加了弹跳的效果,通过添加模型的材质,增添预设来实现,下面是效果图。

首先,是预设的设置。学长在文章中只说了可以往预设中添加立方体,实际上我们还可以通过给预设中的立方体添加各种组件来让其拥有各种各样的效果。这次我主要加了三种组件:

1.material(材质),在Assets的Resources中创建,然后拖动到预设的立方体中。它可以让你的预设的颜色与花纹花里胡哨起来

2.Rigidbody(刚体),给物体添加质量等物理性质,使其能够下落。在预设组件中点击add Component后,直接搜索即可。

这里额外提一点,不同的物体间要加上碰撞体的组件才可进碰撞,不过组件一开始都会自动创建好碰撞体,也可以根据个人需要调整碰撞体模型和参数。

3.physic material(物理材质),创建方式跟添加方式跟materail一样 ,通过将摩擦力设为0,弹力设为1,可实现完全弹性碰撞,这里我把弹力设为0.7,蹦几下就会停下。

最后你的组件应该是这样的,其中物理性质好像没有具体组件,但不要忘记拖进去。

接下来,就是在游戏运行中添加预设,下面是学长的添加方式,给你要用的棋子模型添加提供游戏对象。不过我一直没搞懂Shader.Find是什么东西,所以用了上面那种提前添加组件的方法,免去了材质的修改。

        chess[counter] = Instantiate(Resources.Load("Chess"), grid.transform.position, Quaternion.identity) as GameObject;//同时我们还可以利用counter来判断回合chess[counter].GetComponent<Renderer>().material = new Material(Shader.Find(counter%2?material1:material2));

最后,是如何使点击屏幕生成具体的棋子,依旧先看学长的表现方式。

void OnMouseUp(){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RayCastHit hit;//判断是否检测到了if(Physics.RayCast(ray, out hit)){//画条线看的更清楚Debug.DrawLine(ray.origin, hit.point);//既然是射线,那我们获得的肯定是碰撞体了,所以没有碰撞体这个组件的是检测不到的!GameObject grid = hit.collider.gameObject;//用一个一维数组保存即可,因为我们不需要知道位置在哪,只需要方便我们销毁就行,用一个counter来记录数量chess[counter] = Instantiate(Resources.Load("Chess"), grid.transform.position, Quaternion.identity) as GameObject;//同时我们还可以利用counter来判断回合chess[counter].GetComponent<Renderer>().material = new Material(Shader.Find(counter%2?material1:material2));}
}

这里有两个坑点:

1.直接按照学长的方式放置棋子,棋子会直接嵌进棋盘,所以我们要拔高棋子生成的高度。(但不知道为什么,我其中一个位置的数据一直有问题,进行了特判。各位如果位置数据没问题,可删掉)

2.我的脚本是直接放进自然光或摄像头运行的,这样根本没有物体给你进行OnMouseUp,无法调用该函数。所以我把函数放入update中,并使用    if(Input.GetMouseButtonDown(0))   进行判断。

以下是我的脚本,需要完整的 Assets文件夹可在上方传送门跳转到github

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class cc : MonoBehaviour
{private GameObject[,] ChessTable = new GameObject[3,3];private GameObject[,] chess= new GameObject[3,3];private int[,] state = new int[3,3];private int counter;void Start(){string m1 = "grid1",m2 = "grid2";for(int i = 0;i < 3;i++){for(int j = 0;j <3;j++){ChessTable[i,j] = Instantiate(Resources.Load((i+j)%2==1?m1:m2), new Vector3(i, 0, j), Quaternion.identity) as GameObject;ChessTable[i,j].transform.parent = this.transform;}}Restart();}//void Restart(){counter = 0;for(int i = 0;i < 3;i++)for(int j = 0;j <3;j++){state[i,j] = 0;GameObject.Destroy(chess[i,j]);}}void createchess(){string m1 = "chess1",m2 = "chess2";Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;//判断是否检测到了if(Physics.Raycast(ray, out hit)){//画条线看的更清楚Debug.DrawLine(ray.origin, hit.point);//既然是射线,那我们获得的肯定是碰撞体了,所以没有碰撞体这个组件的是检测不到的!GameObject grid = hit.collider.gameObject;int x  = (int)grid.transform.position.x,y = (int)grid.transform.position.z;if(grid.transform.position.x>0.9&&grid.transform.position.x<1.1)x = 1;if(state[x,y]==0){chess[x,y] = Instantiate(Resources.Load(counter%2==1?m1:m2), new Vector3(x,1,y), Quaternion.identity) as GameObject;//同时我们还可以利用counter来判断回合chess[x,y].transform.parent = this.transform;state[x,y] = counter%2==0?1:-1;counter += 1;}}}int judge(){int win = 0,t;//主对角线t = state[0,0];for(int i = 1;i<=2;i++){win = t;if(t != state[i,i]){win = 0;break;}}if(win==1||win==-1)return win;//斜对角线t = state[0,2];for(int i = 1;i<=2;i++){win = t;if(t != state[i,2-i]){win = 0;break;}}if(win==1||win==-1)return win;//竖线for(int j = 0;j<=2;j++){t = state[0,j];for(int i = 1;i<=2;i++){win = t;if(t != state[i,j]){win = 0;break;}}if(win==1||win==-1)return win;}//横线for(int j = 0;j<=2;j++){t = state[j,0];for(int i = 1;i<=2;i++){win = t;if(t != state[j,i]){win = 0;break;}}if(win==1||win==-1)return win;}if(counter==9)return 2;return 0;}void OnGUI(){//生成一个菜单栏GUI.Box (new Rect (10, 10, 100, 90), "菜单");if (GUI.Button (new Rect (20, 40, 80, 20), "新游戏")) {this.Restart();}int r = judge();if(r==1||r==-1||r==2){//winstring m;if(r==1)m="你赢了";else if(r==-1)m = "你输了";else m = "平局";GUI.Box (new Rect (Screen.width / 2 - 100, Screen.height / 2 + 50, 200, 100), m);if (GUI.Button (new Rect (Screen.width / 2 - 80, Screen.height / 2, 160, 20), "重开"))this.Restart ();}}// Update is called once per framevoid Update(){if(Input.GetMouseButtonDown(0))createchess();}
}

3D游戏编程 作业二 奢华井字棋相关推荐

  1. python二维游戏示例_Python实现的井字棋(Tic Tac Toe)游戏示例

    本文实例讲述了Python实现的井字棋(Tic Tac Toe)游戏.分享给大家供大家参考,具体如下: 说明 用python实现了井字棋,整个框架是本人自己构思的,自认为比较满意.另外,90%+的代码 ...

  2. java井字棋编程的收获_Java 井字棋小结

    1.井字棋获胜的四种情况 横行全为同一符号 竖行全为同一符号 斜对角线为同一符号 反对角线为同一符号 2.编程思路 构建数组(二维)读入数据 分四个部分,分别判断横行,竖行,对角线,反对角线是否满足条 ...

  3. python井字棋游戏代码_Python实现的井字棋(Tic Tac Toe)游戏示例

    Python实现的井字棋(Tic Tac Toe)游戏示例 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  Python实现的井字棋(Tic Tac Toe)游戏示 ...

  4. 井字棋小游戏c语言简单编码,井字棋小游戏(C语言)

    1 #include 2 #include 3 #include 4 #include 5 #include 6 7 void drawBoard(char *board) //绘制棋盘 8 {9 p ...

  5. 3D游戏编程 作业三 牧师与魔鬼

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.任务要求 二. 任务分析 1.游戏规则 2.游戏对象 3.动作表 二. 项目展示 1.mvc架构 导演 SSDir ...

  6. 3D游戏编程 作业五 枪打恶鬼(打飞碟)

    前言 这次的作业个人感觉挺好玩的,我给做成了射击游戏.同时我也在其中学到了unity的一些有趣应用, 下面先把大的框架给讲一下,然后再着重讲一下我个人的收获吧. Asset文件:github 参考博客 ...

  7. 3D游戏编程 作业六 打飞碟改进

    前言 这次的任务是实现物理学运动,结果我发现在上次作业中我全给实现了. 所以这次只要简单实现adapter就行了. model脚本:github 原版代码:上次作业 一.任务要求 二. 项目展示 我的 ...

  8. tic-tac-toe游戏c语言,Tic-Tac-Toe(井字棋)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 bool PlayerTurn() { //选手的回合 &nbsp&nbsp&nbsp int x, y; &nbsp&a ...

  9. unity井字棋和一些重要概念(中山大学3D游戏作业2)

    中山大学3D游戏作业2 一.简答题 1. 解释游戏对象和资源的联系和区别 2.下载几个游戏案例,总结资源.对象组织的结构. 3.编写代码使用debug语句验证MonoBehaviour基本行为或事件触 ...

最新文章

  1. h264和h265多维度区别
  2. 中国增速第一!《全球数字经济白皮书》发布
  3. 以系统最高权限运行软件
  4. Worksheet.get_Range Method
  5. CTF(Capture The Flag)
  6. html5控制符置于底层,HTML5占位符在焦点上消失
  7. 计算机文化基础第二次答案,中国石油大学2020年秋计算机文化基础第二次在线作业答案...
  8. WKWebView不显示JS的alert弹窗的解决办法
  9. Java 8 你需要掌握的新特性
  10. 全国大学生软件测试大赛Web应用测试(八)Web众包测试具体流程
  11. 中国的顶级黑客-小榕
  12. Gabor变换(2)
  13. OpenJ_Bailian - 1088:滑雪
  14. Silverlight游戏设计(Game Design):(八)三国策(Demo) 之 “江山一统”①
  15. COMSOL如何绘制紧贴圆柱面的圆面
  16. 7-3 计算平均成绩 (15分)
  17. 计算机基础知识是一级吗,计算机二级和初级的区别 初级是一级吗
  18. 安装r 源代码 linux,在RStudio中从源代码安装R软件包时遇到问题-Ubuntu 16.04
  19. 光纤布线兵法之热点问题篇(一)
  20. mybatis-学习笔记-联系我获取md文档

热门文章

  1. 国科大大数据系统与大规模数据分析课程第一次作业(hash distinct)
  2. mysql从库设置为只读
  3. 一根RS485线可以并联多少设备
  4. JSP问卷调查及管理系统(分为用户端和管路端,代码主要编写管理端)
  5. 电商直播的注意事项有哪些
  6. 福禄克DSX2-8000/DSX2-5000 CH 电缆测试仪带了Cat 6A的测试方法: 超6类网线——光明的未来
  7. jQuery总结四、append 与appendTo、after、before、wrap、unwrap、replaceWith、empty()、remove;detach、is、hasclass
  8. 采访Vasco Duarte和Jason Little: 来自Happy Melly Express的《精益变革管理》
  9. 3-5V直推线路板 1.2V升压太阳能火焰灯单片机IC方案
  10. 2.文件上传后没有权限不够