Unity3D_俯视角点击移动

该代码示例展示了如何在Unity中使用C#脚本来控制坦克的履带动画,通过材质的UV偏移模拟履带移动。当鼠标右键点击时,会进行Raycast检测以确定目标位置,然后根据目标位置调整坦克的转向和履带运动方向。同时,它还包含了动画播放和暂停的逻辑控制。
摘要由CSDN通过智能技术生成

代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using DG.Tweening;
using Spine;
using Spine.Unity;

public class TankMoveTest : MonoBehaviour
{
    public GameObject 左履带;
    public GameObject 右履带;
    public GameObject 车体;
    public SkeletonAnimation 点击动画;

    [SerializeField] private float 车体转速 = 30;
    [SerializeField] private float 前进速度 = 3;
    [SerializeField] private float 履带动画速度 = 1;

    Material 左履带材质, 右履带材质;
    Tween 左履带前进动画, 左履带后退动画, 右履带前进动画, 右履带后退动画;
    Vector3 点击位置;

    void Start()
    {
        Application.targetFrameRate = 30;//限制帧率

        左履带材质 = 左履带.GetComponent<Renderer>().material;
        右履带材质 = 右履带.GetComponent<Renderer>().material;

        //用材质的UV偏移移动履带贴图
        左履带前进动画 = 左履带材质.DOOffset(new Vector2(履带动画速度, 0), 1).SetEase(Ease.Linear).SetLoops(-1, LoopType.Incremental).Pause();
        左履带后退动画 = 左履带材质.DOOffset(new Vector2(-履带动画速度, 0), 1).SetEase(Ease.Linear).SetLoops(-1, LoopType.Incremental).Pause();
        右履带前进动画 = 右履带材质.DOOffset(new Vector2(履带动画速度, 0), 1).SetEase(Ease.Linear).SetLoops(-1, LoopType.Incremental).Pause();
        右履带后退动画 = 右履带材质.DOOffset(new Vector2(-履带动画速度, 0), 1).SetEase(Ease.Linear).SetLoops(-1, LoopType.Incremental).Pause();
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(1))//按下鼠标右键执行一次
        {
            /*从摄像机向鼠标方向发射射线,获取鼠标位置*/
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            LayerMask mask = 1 << (LayerMask.NameToLayer("Floor"));

            /*Raycast参数:
             [1]射线方向
             [2]碰撞到的对象信息
             [3]射线长度,Mathf.Infinity为无限远
             [4]遮罩图层,不检测其他图层的物体
             */
            if (Physics.Raycast(ray, out hit, Mathf.Infinity, mask.value))
            {
                Debug.DrawLine(ray.origin, hit.point, Color.green);//在编辑器视图中绘制射线
                点击位置 = hit.point;
                点击动画.transform.position = new Vector3(点击位置.x, 0.1f, 点击位置.z);
                点击动画.AnimationState.SetAnimation(0, "animation", false);//播放点击动画

                /*差乘判断目标位置在车头左边还是右边*/
                Vector3 direction = 点击位置 - 车体.transform.position;
                var cross = Vector3.Cross(车体.transform.forward, direction);

                if (cross.y < 0)//左
                {
                    履带停止();
                    左履带后退();
                    右履带前进();
                }
                else//右
                {
                    履带停止();
                    左履带前进();
                    右履带后退();
                }

                //原地向目标点方向转动
                车体.transform.DOLookAt(点击位置, 车体转速, AxisConstraint.Y , Vector3.up).SetEase(Ease.InOutSine).SetSpeedBased().OnComplete(RotateCallback);
            }
        }
    }

    public void 左履带前进()
    {
        if(左履带后退动画.IsPlaying())
        {
            左履带后退动画.TogglePause();
        }

        左履带材质.DOOffset(new Vector2(0, 0), 0);
        左履带前进动画.TogglePause();
    }

    public void 左履带后退()
    {
        if (左履带前进动画.IsPlaying())
        {
            左履带前进动画.TogglePause();
        }

        左履带材质.DOOffset(new Vector2(0, 0), 0);
        左履带后退动画.TogglePause();
    }

    public void 右履带前进()
    {
        if (右履带后退动画.IsPlaying())
        {
            右履带后退动画.TogglePause();
        }

        右履带材质.DOOffset(new Vector2(0, 0), 0);
        右履带前进动画.TogglePause();
    }

    public void 右履带后退()
    {
        if (右履带前进动画.IsPlaying())
        {
            右履带前进动画.TogglePause();
        }

        右履带材质.DOOffset(new Vector2(0, 0), 0);
        右履带后退动画.TogglePause();
    }

    public void 履带停止()
    {
        if (右履带前进动画.IsPlaying())
        {
            右履带前进动画.TogglePause();
        }
        if (右履带后退动画.IsPlaying())
        {
            右履带后退动画.TogglePause();
        }

        右履带材质.DOOffset(new Vector2(0, 0), 0);

        if (左履带前进动画.IsPlaying())
        {
            左履带前进动画.TogglePause();
        }
        if (左履带后退动画.IsPlaying())
        {
            左履带后退动画.TogglePause();
        }

        左履带材质.DOOffset(new Vector2(0, 0), 0);
    }

    void RotateCallback()//旋转完成回调
    {
        履带停止();

        /*旋转完成后等待0.1s*/
        float timer = 0;
        DOTween.To(() => timer, x => timer = x, 1, 0.1f).OnStepComplete(() =>
        {
            左履带前进();
            右履带前进();
            车体.transform.DOMove(点击位置, 前进速度).SetEase(Ease.InOutSine).SetSpeedBased().OnComplete(MoveCallback);

        }).SetLoops(0);
    }

    void MoveCallback()//前进完成回调
    {
        履带停止();
    }
}

本来只是测试材质UV偏移的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值