353人加入学习
(6人评价)
Steam模拟经营游戏《冒险村的商人日记》从开发到上架全流程

开发 策划 美术 音乐 发行 全部教给你

价格 ¥ 890.00

更好的实现方法

using UnityEngine;

public class CameraMove : MonoBehaviour
{
    private const float MoveSpeed = 0.15f;
    private static readonly Vector3 MinPos = new Vector3(-14, 14, -12);
    private static readonly Vector3 MaxPos = new Vector3(11, 14, 15);
    private static readonly Vector3 InitPos = new Vector3(0, 14, 0);

    private void Start()
    {
        transform.position = InitPos;
    }

    private void Update()
    {
        var trans = transform;
        var position = trans.position;
        
        var x = Input.GetAxis("Horizontal");
        var z = Input.GetAxis("Vertical");

        var newX = position.x + x * MoveSpeed;
        var newZ = position.z + z * MoveSpeed;

        newX = Mathf.Clamp(newX, MinPos.x, MaxPos.x);
        newZ = Mathf.Clamp(newZ, MinPos.z, MaxPos.z);
        
        trans.position = new Vector3(newX, position.y, newZ);
    }
}
[展开全文]

摄像头设置移动速度过快的时候有个问题, 那就是摄像头的 `Transform.position` 移动的时候出现误差.

比如最大值设定为 `15` 的时候, 移动速度过快直接移动到角落会出现 `15.0001` 之类的值, 这时候就会卡死没办法移动, 所以这里需要判断移动位置的极限值.

using UnityEngine;

/// <summary>
/// 摄像头移动
/// </summary>
public class CameraMove : MonoBehaviour{
    
    public Camera target;
    public float moveSpeed = 100f;
    
    
    public Vector2 mixPos = new Vector2(-15, -15);// 最小距离
    public Vector2 maxPos = new Vector2(15 , 15);// 最大距离

    /// <summary>
    /// 程序初始化方法
    /// </summary>
    void Awake() {
        if (target == null) target = Camera.main;    
    }

    void Update() {
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");

        // 获取当前的摄像头位置
        var pos = target.transform.position;

        // 判断目前的是否达到了最大速度
        if (pos.x < mixPos.x || pos.z < mixPos.y) x = 0 ;
        if (pos.x > maxPos.x || pos.z > maxPos.y) z = 0 ;

        Debug.Log(pos);
        // 利用开始进行对象移动
        target.transform.position = new Vector3(
            pos.x + x * moveSpeed ,
            pos.y,
            pos.z + z * moveSpeed 
        );

        // 为了防止出现 15.0001 这种情况需要直接判断最小值和最大值
        pos = target.transform.position;// 再次获取位置准备校验距离
        if (pos.x < mixPos.x) pos.x = mixPos.x;
        if (pos.z < mixPos.y) pos.z = mixPos.y;

        if (pos.x > maxPos.x) pos.x = maxPos.x;
        if (pos.z > maxPos.y) pos.z = maxPos.y;

        // 检查完成重置位置
        target.transform.position = pos;

    }
}

 

[展开全文]

授课教师

独立游戏制作人,业余程序

课程特色

视频(245)
下载资料(22)
图文(1)