Exemplo n.º 1
0
    // Update is called once per frame
    void Update()
    {
        if (hold)
        {
            if (Input.GetMouseButtonUp(0))
            {
                hold = false;

                var        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;
                if (Physics.Raycast(ray, out hit, 500, 1 << SpinHitPadLayer))
                {
                    var v     = ToVector2(Multi((hit.point - Center), DirVector));
                    var angle = Mathf.Atan2(v.x, v.y) - holdAngle;
                    angle = (angle / (2 * Mathf.PI)) * 360;
                    var rotation = RotateVector * angle;
                    rotation  = rotation + new Vector3(360, 360, 360);
                    rotation += startRotation;

                    var minDR = float.MaxValue;
                    var idx   = 0;
                    for (var i = 0; i < AlignRotation.Length; i++)
                    {
                        var align = AlignRotation[i];
                        if (DR(align, rotation) < minDR)
                        {
                            minDR = DR(align, rotation);
                            idx   = i;
                        }
                    }
                    var option = new RotateTo.RotateOptions(RotateObject, AlignRotation[idx], AlignTime);
                    option.OnFinished += (sender, e) =>
                    {
                        var callback = RotateObject.GetComponent <WaypointCallback>();
                        if (callback != null)
                        {
                            callback.ConnectCallback(idx);
                        }
                    };
                    RotateTo.Start(option);
                }
                SpinHitPad.gameObject.SetActive(false);
            }
            else
            {
                var        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;
                if (Physics.Raycast(ray, out hit, 500, 1 << SpinHitPadLayer))
                {
                    var v     = ToVector2(Multi((hit.point - Center), DirVector));
                    var angle = Mathf.Atan2(v.x, v.y) - holdAngle;
                    angle = (angle / (2 * Mathf.PI)) * 360;
                    var rotation = RotateVector * angle;
                    rotation += startRotation;
                    RotateObject.transform.Rotate(rotation - RotateObject.transform.rotation.eulerAngles);
                }
            }
        }
    }
Exemplo n.º 2
0
 public void Damage()
 {
     // 主角与敌人碰撞时(而非踩到了敌人),触发一个旋转动作(其实效果可以做的更有趣一些,
     // 比如先反弹到某一方向(FireTo),然后再弹回等等,此处仅仅举个例子)
     if (rotate == null)
     {
         // 旋转360度,每帧累加5度
         rotate = new RotateTo(360f, 5f);
         rotate.SetActionListener(new RotateActionListener(this));
         AddAction(rotate, hero);
     }
     else if (rotate.IsComplete())
     {
         hero.SetFilterColor(LColor.red);
         // 直接重置rotate对象
         rotate.Start(hero);
         // 重新插入(LGame的方针是Action事件触发且结束后,自动删除该事件,所以需要重新插入)
         AddAction(rotate, hero);
     }
 }