切割的优化

四个切割方向

向左下右上移分别是 1,2,3,4,然后在update里面调用

void setMoveDir () {
    moveDir = 0;
    Vector3 dir = transform.position - lastPos;
    //分别是 左移 下移 右移 上移
    if (dir.x < 0) {
        moveDir = 1;
    }
    if (dir.y < 0) {
        moveDir = 2;
    }
    if (dir.x > 0) {
        moveDir = 3;
    }
    if (dir.y > 0) {
        moveDir = 4;
    }
}

由于切割时要根据一个点和轴来确定切割面,而这个光剑应该是各个方向都是开刃的,轴不好确定,所以还是把切割方法写在被切割的物体身上

放置一个空物体到中心偏前的位置,根据这个物体来切割物块

public void slice () {
    //位置与法线获得切割面
    SlicedHull hull = gameObject.Slice (slicePoint.position, slicePoint.right);
    if (hull != null) {
        GameObject upper = hull.CreateLowerHull (gameObject, sliceSurface);
        GameObject lower = hull.CreateUpperHull (gameObject, sliceSurface);
        GameObject[] objs = new GameObject[] { upper, lower };
        foreach (var obj in objs) {
            //添加刚体并设为凸多面体
            obj.gameObject.AddComponent<Rigidbody> ();
            obj.gameObject.AddComponent<MeshCollider> ().convex = true;
        }
    }
    Destroy (gameObject);
}

最后让它能够朝四个方向旋转

void setAllowDir () {
    allowDir = Random.Range (1,5);
    transform.Rotate (Vector3.forward * 90 * allowDir, Space.Self);
}

效果

视觉优化

由于默认的Cube添加贴图六个面都会加上,但是我又不会用建模工具,所以使用Probuilder工具让物块只有一个面有箭头

找了个箭头的资源https://github.com/764424567/Unity-plugin/tree/master/Menu/Unity3D-ArrowImg

然后使用Probuilder建一个立方体,进入Material编辑面板选择要编辑的面更改Material即可

然后再随便弄个场景

使用Koreographer音游插件

装好Koreographer插件后分别创建这两个资源

需要音频文件,然后定义EventID

之后通过编辑窗口在音乐对应的时间点添加事件,图上每一小段是0.5s,而我们又是“下落式”的音游,关键点是根据物块最终的位置打的,所以设定好物块从起点到终点的移动时间还要将此处的时间点统一前移n秒,比如我物块的移动时间是2s,所以这里就统一前移了2s

给物体添加KoreographerSimpleMusicPlayer两个组件

在同样的物体上添加脚本

public class MusicManager : MonoBehaviour {
    public float offsetTime; //偏移时间
    public string eventID; //事件ID
    public GameObject cubePb;
    public Transform originTrans;
    public Transform targetTrans;
    void Start () {
        Koreographer.Instance.RegisterForEvents (eventID, AddCubeEvent);
    }
    void AddCubeEvent (KoreographyEvent koreoEvent) {
        GameObject gb = Instantiate (cubePb, originTrans.position, cubePb.transform.rotation);
        gb.transform.DOMove (targetTrans.position,offsetTime).OnComplete (delegate () {
            //播放完动画后销毁
            Destroy (gb);
        }).SetEase (Ease.Linear);
    }
}

优化

Cube添加刚体和碰撞体,给Slicer添加碰撞体,重新把检测切割的方法写到OnCollisionEnter

void OnCollisionEnter (Collision other) {
    if (other.gameObject.layer == LayerMask.NameToLayer ("Slice")) {
        if (moveDir == other.gameObject.GetComponent<MoveCube> ().allowDir) {
            effect.GetComponent<ParticleSystem> ().Play ();
            other.transform.GetComponent<MoveCube> ().slice ();
        }
    }
}

看下最后的效果,虽然没有音乐,不过物块都是根据音乐节拍生成的

Last modification:March 17th, 2021 at 08:55 pm