Unity - A计划(一年有效期) 扫二维码继续学习 二维码时效为半小时

(61评价)
价格: 2145.00元
坦克大战2D项目中为什么我的Enemy移动极其缓慢
戏图发起了问答2019-06-12
7
回复
348
浏览
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : MonoBehaviour
{
    //属性
    public float MoveSpeed = 1;

    private Vector3 BllectEulerAngles;

    private float AttackTimeval = 0;//攻击间隔计时器

    private float MoveTimeVal = 5;//移动间隔计时器

    private float h;

    private float v;
    //引用
    private SpriteRenderer sr;

    public Sprite[] TankSprites;//上右下左

    public GameObject Bllect;//子弹

    public GameObject explasion;//死亡特效

    void Start()
    {
        sr = GetComponent<SpriteRenderer>();
    }


    void Update()
    {
        if (AttackTimeval >= 3)
        {
            EnemyAttack();
        }
        else
        {
            AttackTimeval += Time.deltaTime;
        }


    }

    void FixedUpdate()
    {
        if (MoveTimeVal >= 4)
        {
            EnemyMove();
            MoveTimeVal = 0;
        }
        else
        {
            MoveTimeVal += Time.fixedDeltaTime;
        }
    }
    private void EnemyMove()
    {
        int num = Random.Range(0, 8);
        if (num >= 5)//下
        {
            h = 0;
            v = -1;
        }
        else if (num == 0)//上
        {
            h = 0;
            v = 1;
        }
        else if (num > 0 && num <= 2)//左
        {
            h = -1;
            v = 0;
        }
        else if (num > 2 && num <= 4)//右
        {
            h = 1;
            v = 0;
        }
        if (h != 0)//设置优先级
        {
            v = 0;
        }
        //移动
        transform.Translate(Vector3.right * h * MoveSpeed*Time.fixedDeltaTime ,Space.World);
        //变换图片
        if (h < 0)//左
        {
            sr.sprite = TankSprites[3];
            //设置子弹朝向
            BllectEulerAngles = new Vector3(0, 0, 90);
        }
        else if (h > 0)//右
        {
            sr.sprite = TankSprites[1];
            BllectEulerAngles = new Vector3(0, 0, -90);
        }
        //移动
        transform.Translate(Vector3.up * v * MoveSpeed*Time.fixedDeltaTime ,Space.World);
        //变换图片
        if (v < 0)//下
        {
            sr.sprite = TankSprites[2];
            BllectEulerAngles = new Vector3(0, 0, 180);
        }
        else if (v > 0)//上
        {
            sr.sprite = TankSprites[0];
            BllectEulerAngles = new Vector3(0, 0, 0);
        }
    }

    private void EnemyAttack()
    {

        //实例化子弹  旋转角度:当前坦克角度+子弹应旋转角度
        Instantiate(Bllect, this.transform.position, Quaternion.Euler(transform.eulerAngles + BllectEulerAngles));
        AttackTimeval = 0;

    }

    private void EnemyDie()
    {
        Instantiate(explasion, transform.position, Quaternion.identity);
        Destroy(this.gameObject);
    }

    private void OnCollisionEnter2D(Collision collision)
    {
        if (collision.collider.tag.Equals("Enemy"))
        {
            MoveTimeVal = 4;
        }
    }
}

我按照视频中的来用translate方法控制Enemy移动,却移动的十分缓慢

所有回复
  • 老师_Trigger 2019-06-13

    同学你好,可能是摄像机远近造成的尺寸问题,可以把镜头拉近或者把速度调快。

    还有-3条回复,点击查看
    你还没有登录,请先登录注册
  • 戏图 2019-06-13

    这应该不是摄像机的问题,可以看到他的x和y变化数值极小,没有达到预期

    移动缓慢.mp4 预览 下载
    • 老师_Trigger 2019-06-13

      移动缓慢的问题可以下载老师源码看看,因为同学截图给老师的代码没什么问题。可以debug一下看看,是不是方法没有执行或者脚本挂错了。

      (0) 回复
    还有-4条回复,点击查看
    你还没有登录,请先登录注册
  • 戏图 2019-06-13
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Bllect : MonoBehaviour
    {
        // 属性
        public float BllectSpeed = 10;
        public bool IsPlayer = true;
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
            transform.Translate(transform.up * BllectSpeed * Time.deltaTime, Space.World);
    
        }
    
        //触发检测
        void OnTriggerEnter2D(Collider2D collision)
        {       
            switch (collision.tag)
            {
                case "Tank":
                    if (!IsPlayer)
                    {
                        collision.SendMessage("PlayerDie");
                        print("怎么肥四");
                        Destroy(collision.gameObject);
                    }
                    break;
                case "Heart":
                    collision.SendMessage("HeartDie");
                    break;
                case "Wall":
                    Destroy(collision.gameObject);
                    Destroy(gameObject);
                    break;
                case "Barrier":
                    Destroy(gameObject);
                    break;
                case "Enemy":
                    if (IsPlayer)
                    {
                        collision.SendMessage("EnemyDie");
                        Destroy(collision.gameObject);
                        Destroy(gameObject);
                    }
                    break;
                default:
                    break;
            }
        }
    }

    为什么我的坦克被子弹击中时,触发检测了两次??

    触发检测触发了两次.mp4 预览 下载
    • 老师_Trigger 2019-06-13

      双击debug内容看看,是不是触发检测检到了两次,实在不行加老师QQ1925774628,远程看看。一定得自己尝试解决

      (0) 回复
    还有-4条回复,点击查看
    你还没有登录,请先登录注册
发表回复
你还没有登录,请先 登录或 注册!