686
社区成员




在unity开发中经常会遇到移动控制的问题,结合自己在项目中完成对unity2d中角色键盘控制移动和怪物自动化移动脚本编写,来总结下unity移动的2大类型:控制移动和自动化移动
编写Unity角色移动脚本的一般步骤如下:
首先,在Unity中创建一个新的C#脚本。可以通过右键菜单 -> Create -> C# Script,或者在Project面板中点击“Create”按钮来创建。
打开刚刚创建的脚本,并在其中定义一个变量来存储角色的速度。例如,可以使用以下代码行来定义一个名为“speed”的公共浮点数变量:
public float speed = 10.0f;
接下来,在Update()方法中编写脚本的主要逻辑。首先,获取角色的Transform组件并存储在一个变量中:
Transform playerTransform = GetComponent<Transform> ();
float moveHorizontal = Input.GetAxis ("Horizontal");
float moveVertical = Input.GetAxis ("Vertical");
Vector2 movement = new Vector2 (moveHorizontal, moveVertical);
float distance = speed * Time.deltaTime;
playerTransform.Translate (movement * distance);
完整源码:
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范围内随机移动脚本编写的一般步骤:
public float speed = 5f;
public Vector3 moveRange = new Vector3(10f, 0f, 10f);
Transform myTransform = GetComponent<Transform>();
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);
完整源码:
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;
}
}
}
出现缝隙卡顿的问题
是由于移动的速度过快,导致游戏对象穿过了场景中的物体或者边缘处无法准确停留。解决方法是使用合适的碰撞检测和物理引擎来避免对象穿过其他物体,并且适当调整移动速度和目标位置来避免对象在边缘处错位。
出现移动方向不正确
是由于移动方法的实现不正确或者移动方向和力量的计算出现错误。解决方法是确保计算所使用的向量和力量的方向和大小是正确的,并且遵守正确的移动逻辑和规则。
出现移动中发生卡顿
是由于代码中出现了无限循环或者死循环等问题。解决方法是仔细检查代码,查找并修复这些问题,或者使用调试器进行调试和测试。
通过对unity移动控制和随机移动脚本编程的学习,可以实现大多数游戏中移动的通用功能,具有很强的普适性。