个人技术总结——unity2D角色控制移动和怪物随机移动脚本编写

022000515_林翔 学生 2023-06-07 00:34:00

目录

  • 一丶技术概述
  • 二丶技术详述
  • 角色控制移动脚本的编写方法,步骤如下:
  • 怪物随机移动脚本的编写方法,步骤如下:
  • 三丶技术使用中遇到的问题和解决过程
  • 四丶 总结
  • 五丶参考文献、参考博客

一丶技术概述

在unity开发中经常会遇到移动控制的问题,结合自己在项目中完成对unity2d中角色键盘控制移动和怪物自动化移动脚本编写,来总结下unity移动的2大类型:控制移动和自动化移动

二丶技术详述

角色控制移动脚本的编写方法,步骤如下:

编写Unity角色移动脚本的一般步骤如下:

  1. 首先,在Unity中创建一个新的C#脚本。可以通过右键菜单 -> Create -> C# Script,或者在Project面板中点击“Create”按钮来创建。

  2. 打开刚刚创建的脚本,并在其中定义一个变量来存储角色的速度。例如,可以使用以下代码行来定义一个名为“speed”的公共浮点数变量:

    public float speed = 10.0f;
    
  3. 接下来,在Update()方法中编写脚本的主要逻辑。首先,获取角色的Transform组件并存储在一个变量中:

Transform playerTransform = GetComponent<Transform> ();
  1. 然后,获取用户输入的移动方向(水平和垂直轴)并将其存储在一个二维向量中:
float moveHorizontal = Input.GetAxis ("Horizontal");
float moveVertical = Input.GetAxis ("Vertical");
Vector2 movement = new Vector2 (moveHorizontal, moveVertical);
  1. 接下来,根据速度和时间计算角色应该在当前帧中移动的距离:
float distance = speed * Time.deltaTime;
  1. 最后,将距离向量和移动向量相乘,以获得角色应该在当前帧中移动的实际位移:
playerTransform.Translate (movement * distance);
  1. 最后,将脚本附加到角色游戏对象上,并在场景中测试脚本。可以使用Unity编辑器中的游戏运行模式或按下“Play”按钮来进行测试。

完整源码:

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

public class move : MonoBehaviour
{
    public float moveSpeed = 5f; // 角色移动速度
    public Camera mainCamera; // 相机对象

    void Start()
    {
        mainCamera = Camera.main; // 获取相机对象
    }

    void Update()
    {
        // 获取输入方向
        float horizontalInput = Input.GetAxis("Horizontal");
        float verticalInput = Input.GetAxis("Vertical");

        // 计算角色移动距离
        Vector3 moveDirection = new Vector3(horizontalInput, verticalInput, 0);
        float moveDistance = moveSpeed * Time.deltaTime;
        Vector3 moveVector = moveDirection.normalized * moveDistance;

        // 更新角色位置
        transform.position += moveVector;

        // 更新相机位置
        Vector3 cameraPosition = mainCamera.transform.position;
        cameraPosition.x = transform.position.x;
        cameraPosition.y = transform.position.y;
        mainCamera.transform.position = cameraPosition;
    }
}

怪物随机移动脚本的编写方法,步骤如下:

以下是Unity范围内随机移动脚本编写的一般步骤:

  1. 首先,创建的脚本,并在其中声明一些需要使用的变量。例如,我们需要定义一个公共浮点数变量来表示对象的移动速度,一个公共向量3变量来表示移动的范围:
public float speed = 5f;
public Vector3 moveRange = new Vector3(10f, 0f, 10f);
  1. 在Start()方法中,获取游戏对象的Transform组件并将其存储在一个变量中:
Transform myTransform = GetComponent<Transform>();
  1. 在Update()方法中,生成一个随机的向量3变量来表示下一步的目标位置,然后使用向量3的Lerp方法来计算新的位移向量:
Vector3 randomDirection = new Vector3(Random.Range(-moveRange.x, moveRange.x), 0, Random.Range(-moveRange.z, moveRange.z));
myTransform.position = Vector3.Lerp(myTransform.position, randomDirection, Time.deltaTime * speed);
  1. 最后,将脚本附加到场景中的游戏对象上,并在编辑模式下测试脚本。可以在Inspector面板中设置移动速度和移动范围,并查看游戏对象是否在指定范围内随机移动。

完整源码:

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

public class move2 : MonoBehaviour
{
    private Vector3 targetPosition;//下一个随机位置
    private float range = 2f;

    private float speed = 0.5f;//人物速度
    private Rigidbody2D rbody;//刚体组件
    private Transform targetTransform;    //目标对象的 transform 组件
    private Animator anim;
    private Vector2 move;
    private Vector3 beginPosition;
    void Start()
    {

        rbody = GetComponent<Rigidbody2D>();
        anim = GetComponent<Animator>();// 获取怪物的动画管理器Animator
        beginPosition = transform.position;
    }


    void Update()
    {

        if (targetTransform != null)
        {
            Vector3 targetDirection = (targetTransform.position - transform.position).normalized;
            move.x = targetDirection.x;
            move.y = targetDirection.z;
            anim.SetFloat("moveX", move.x);
            anim.SetFloat("moveY", move.y);
            targetPosition = targetTransform.position;
            transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);
        }
        else
        {
            Vector3 targetDirection = (beginPosition - transform.position).normalized;
            move.x = targetDirection.x;
            move.y = targetDirection.z;
            anim.SetFloat("moveX", move.x);
            anim.SetFloat("moveY", move.y);
            float distance = Vector3.Distance(transform.position, beginPosition);
            if (distance > 0.1f && distance <= range)
            {
                targetPosition = beginPosition;
                transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);

            }
            else if (distance > range)
            {

                transform.position = Vector3.MoveTowards(transform.position, beginPosition, speed * Time.deltaTime);

            }

        }
        if (Vector3.Distance(beginPosition, transform.position) < 0.1f)
        {
            anim.SetBool("unmove", true);
        }
        else
        {
            anim.SetBool("unmove", false);
        }
    }

    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.gameObject.CompareTag("Player")) //判断进入范围的游戏对象标签是否为“Player”
        {
            targetTransform = other.transform;

        }

    }
    /// <summary>
    /// 角色离开触发器
    /// </summary>
    /// <param name="other"></param>
    void OnTriggerExit2D(Collider2D other)
    {
        if (other.CompareTag("Player") && other.transform == targetTransform)
        // 离开范围的物体标签是“Player”,并且是当前追踪的目标对象才进行处理
        {
            targetTransform = null;

        }

    }
}

三丶技术使用中遇到的问题和解决过程

  1. 出现缝隙卡顿的问题

    是由于移动的速度过快,导致游戏对象穿过了场景中的物体或者边缘处无法准确停留。解决方法是使用合适的碰撞检测和物理引擎来避免对象穿过其他物体,并且适当调整移动速度和目标位置来避免对象在边缘处错位。

  2. 出现移动方向不正确

    是由于移动方法的实现不正确或者移动方向和力量的计算出现错误。解决方法是确保计算所使用的向量和力量的方向和大小是正确的,并且遵守正确的移动逻辑和规则。

  3. 出现移动中发生卡顿

    是由于代码中出现了无限循环或者死循环等问题。解决方法是仔细检查代码,查找并修复这些问题,或者使用调试器进行调试和测试。

    四丶 总结

    通过对unity移动控制和随机移动脚本编程的学习,可以实现大多数游戏中移动的通用功能,具有很强的普适性。

五丶参考文献、参考博客

1.Unity控制角色移动方式
2.Unity官方技术文档
3.unity在一定范围内进行随机移动

...全文
1668 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

686

社区成员

发帖
与我相关
我的任务
社区描述
2023年福州大学软件工程实践课程W班的教学社区
软件工程团队开发软件构建 高校 福建省·福州市
社区管理员
  • FZU_SE_teacherW
  • aboutazhang
  • 郭渊伟
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧