unity 一个拼图demo(七巧板)和一个切割demo—2
来源:互联网 发布:mdf打开 sql 查看 编辑:程序博客网 时间:2024/05/14 13:25
前面好久之前只是讲到了七巧板的和切割的原理,这节就讲一下2个demo的主游戏逻辑的代码。先说一下切割demo的逻辑代码,首先我们的准备一个题库,这个题库最好做成Excel表,然后最好直接转成ScriptObject序列化的文件,如果大家有这方面的需要我也可以提供代码,还有一种简单的就是直接由Excel转json,然后通过json读数据这样显然跟家复杂并且比第一种方法慢些。题目的格式得自己去定了,就是Excel表的内容得自己定,例如可能存的是多边形每个角的坐标位置,还有怎么分的问题。贴一下MainSliceGame这个类:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using DG.Tweening;using UnityEngine;public class MainSliceGame:MonoBehaviour{ private SliceMeshMrg _meshManager; [SerializeField] private int _level; [SerializeField] private Material mat; [SerializeField] private Material lineMaterial; private void Start() { _meshManager = new SliceMeshMrg(); _meshManager.ResetLevePath(_level); _meshManager.Intilized(mat); } private Vector3 _preVector3; private Vector3 _nextVector3; private Vector3 _tempVector3; private Vector3 _temp1Vector3; private List<Vector3> _originList; private GameObject _knife; private GameObject _slicePeace; private void Update() { if (Input.GetMouseButtonDown(0)) { _preVector3 = Camera.main.ScreenToWorldPoint(Input.mousePosition); } else if (Input.GetMouseButtonUp(0)) { _nextVector3 = Camera.main.ScreenToWorldPoint(Input.mousePosition); if (_knife != null) { Destroy(_knife); } Vector3 start=new Vector3(_preVector3.x,_preVector3.y,-0.1f); Vector3 end=new Vector3(_nextVector3.x,_nextVector3.y,-0.1f); _meshManager.SliceMeshObj(start,end); } else if(Input.GetMouseButton(0)) { _tempVector3 = Camera.main.ScreenToWorldPoint(Input.mousePosition); float t = Vector3.Dot((_tempVector3 - _preVector3).normalized, (_temp1Vector3 - _preVector3).normalized); float angle = Mathf.Acos(t)*Mathf.Rad2Deg; float distance = Vector3.Magnitude(_tempVector3 - _temp1Vector3); if ((distance > 0.01f || angle > 1f)) { if (_knife != null) { Destroy(_knife); } _knife = _meshManager.CreateLineMeshObj(_preVector3, _tempVector3, lineMaterial); _knife.transform.position = new Vector3(0, 0, 1f); } _temp1Vector3 = _tempVector3; } }}主要的作用就真的只是鼠标输入,及控制切割的部分。这里还有ui,优化都没有做,感觉连个demo都不能算了,只能算是一段小程序。后面那个七巧板爷要用到数据读取,所以建议同意写一个编辑器统一来处理,说不定下个项目还可以用用。
public class GameLayer:InputHandler{ [SerializeField] private RotateTipImage _rotateTipImage; [SerializeField] private GameObject mainGameObject; [SerializeField] private Material meshMaterial; [SerializeField] private Material borderMaterial; private float scalex; private float scaley; private MeshManager _meshManager; private void Awake() { Vector3 scale = mainGameObject.transform.localScale; scalex = scale.x; scaley = scale.y; _meshManager=new MeshManager(); _meshManager.ResetLevePath(1); } private void Start() { _meshManager.Intilized(mainGameObject.transform, meshMaterial, borderMaterial, scalex, scaley); } private Sprite _sprite; protected override void Update() { _rotateTipImage.OnUpdate(Time.deltaTime); base.Update(); if (_meshManager.JudgeGameWin()) { _sprite = _meshManager.ReIntilizMesh(); _rotateTipImage.TipGameObject.GetComponent<SpriteRenderer>().sprite = _sprite; } } private GameObject _curSegment; private Vector3 _originVector3; private GameObject _parentGameObject; public override void OneTouchMove() { Vector3 curveVector3 = Input.GetTouch(0).position; curveVector3 = Camera.main.ScreenToWorldPoint(curveVector3); if (_curSegment != null) { float z = _parentGameObject.transform.position.z; if (TouchCount > 1) { _curSegment.transform.parent = null; _parentGameObject.transform.position = new Vector3(curveVector3.x, curveVector3.y, z); _curSegment.transform.parent = _parentGameObject.transform; } _parentGameObject.transform.position = new Vector3(curveVector3.x, curveVector3.y, z); } } public override void OneTouchDown() { _curSegment = null; Vector3 pos = Input.GetTouch(0).position; _originVector3 = Camera.main.ScreenToWorldPoint(pos); Ray ray = Camera.main.ScreenPointToRay(pos); RaycastHit hit; if (Physics.Raycast(ray, out hit, 100)) { _curSegment = hit.transform.gameObject; _originVector3 = hit.point; _parentGameObject = new GameObject("sd"); _parentGameObject.transform.position = hit.point; _curSegment.transform.parent = _parentGameObject.transform; } } public override void OneTouchUp() { bool b1 = Mathf.Abs(_curSegment.transform.eulerAngles.z) < 5 || Mathf.Abs(_curSegment.transform.eulerAngles.z-360)<5; bool b2 = Mathf.Abs(_curSegment.transform.position.x) + Mathf.Abs(_curSegment.transform.position.y) < 0.5f; if (b1 && b2 && _curSegment != null) { _curSegment.transform.position = new Vector3(0, 0, -0.1f); _curSegment.transform.eulerAngles = Vector3.zero; var sd = _curSegment.transform.parent; _curSegment.transform.parent = null; Destroy(sd.gameObject); } } private Vector3 _origintouch1Vector3; private Vector3 _origintouch2Vector3; private Vector3 _midVector3; public override void TwoTouchDown() { var t1 = Input.GetTouch(0).position; _origintouch1Vector3 = Camera.main.ScreenToWorldPoint(t1); var t2 = Input.GetTouch(1).position; Ray ray = Camera.main.ScreenPointToRay(t2); RaycastHit hit; if (Physics.Raycast(ray, out hit, 100)) { _originVector3 = hit.point; _origintouch2Vector3 = Camera.main.ScreenToWorldPoint(t2); _midVector3 = (_origintouch1Vector3 + _origintouch2Vector3) / 2; float z = _parentGameObject.transform.position.z; _curSegment.transform.parent = null; _parentGameObject.transform.position = new Vector3(_midVector3.x, _midVector3.y, z); _curSegment.transform.parent = _parentGameObject.transform; } } private Vector3 _curtouch1Vector3; private Vector3 _curtouch2Vector3; public override void TwoTouchMove() { var t2 = Input.GetTouch(1).position; _curtouch1Vector3 = Camera.main.ScreenToWorldPoint(t2); var t1 = Input.GetTouch(0).position; _curtouch2Vector3 = Camera.main.ScreenToWorldPoint(t1); Vector3 offset2 = (_curtouch2Vector3 - _curtouch1Vector3).normalized; Vector3 offset1 = (_origintouch2Vector3 - _origintouch1Vector3).normalized; float value = offset1.x*offset2.y - offset1.y*offset2.x; float angle = Mathf.Asin(value)*Mathf.Rad2Deg; _parentGameObject.transform.localEulerAngles=new Vector3(0,0,-angle); } public override void TwoTouchUp() { OneTouchUp(); }}GameLayer继承Input,input提供输入操作模板,让gamelayer来重写方法,这里重写的都是一些输入方法,OneTouchMove,OneTouchDown,OneTouchUp,TwoTouchMove,TwoTouchUp所以代码理解起来都比较简单。这里主要难以理解就是网格的方面的数学知识了。最后给出原项目地址:http://pan.baidu.com/s/1hrPVOjE
阅读全文
0 0
- unity 一个拼图demo(七巧板)和一个切割demo
- unity 一个拼图demo(七巧板)和一个切割demo—2
- unity接微信androidSDK,一个供参考测试的Demo
- [Unity资源]一个GTA5的DEMO的手游分享
- 一个涵盖 eq() 和IFrame 的demo
- 【JavaScript】第一个Demo和一个问题
- Kotlin和RecyclerView的一个demo
- MapBar的一个Demo
- 一个Com+ Demo
- wxMenu的一个demo
- 一个SG案例demo
- 一个移动检测 demo
- 一个CheckBox Demo
- 一个可拖拽列宽表格demo
- 一个ajax demo
- IHttpAsyncHandler 的一个DEMO
- IHttpAsyncHandler 的一个DEMO
- Extjs 一个 Grid demo
- String类的常用方法(1)A
- LeetCode 231 Power of Two AND LeetCode 326 Power of Three
- bootstrap table中显示头行结构
- zookeeper和dubbo的关系
- Codeforces Round #427 (Div. 2)(A+B)
- unity 一个拼图demo(七巧板)和一个切割demo—2
- [Visual Studio]MFC游戏开发之回合制对战系统一_by书訢
- 电商项目实战——第一天(环境部署)3搭建vsftpd服务器
- JavaScript-函数之css()
- ZOJ 1134 Strategic Game(树形DP)
- Unity3d制作菜单栏
- java虚拟机加载机制(笔记)
- 表单中的enctype属性是干嘛的
- native-echarts中formatter不能换行或换行后不居中