unity 一个拼图demo(七巧板)和一个切割demo—2

   前面好久之前只是讲到了七巧板的和切割的原理,这节就讲一下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
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值