重置后球轨迹完全相同(Unity)

Posted

技术标签:

【中文标题】重置后球轨迹完全相同(Unity)【英文标题】:Ball trajectory exactly the same after reset (Unity) 【发布时间】:2021-12-10 03:27:12 【问题描述】:

我目前在制作乒乓球游戏时遇到了问题。通常情况下,您会期望乒乓球的轨迹在每次调用 Reset() 后随机变化,但不知何故,它会停留在先前的轨迹中,并将沿着该路径继续。

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

public class Ball : MonoBehaviour

    Rigidbody2D rb;
    float rand;
    Vector3 ballinitialpos;
    Vector3 lastpos;
    Vector3 lastVect;
    Vector3 newVect;
    Vector2 directionVector;
    // Start is called before the first frame update
    void Start()
    
        rb = GetComponent<Rigidbody2D>();
        ballinitialpos = new Vector3(transform.position.x, transform.position.y, transform.position.z);
        Nudge();
    


    void Nudge()
    
        rand = UnityEngine.Random.Range(0, 2);
        if (rand <= 1)
        
            directionVector = new Vector3(-20f,10f,0f);
        
        else
        
            directionVector = new Vector3(20f,10f,0f);

        
         rb.velocity = directionVector;
    
 
    // Update is called once per frame
    void Update()
    
        lastVect = rb.velocity;
  
     

    void Reset()
    
        transform.position = ballinitialpos;
        
        Nudge();
    

  
   
    void ReflectVector(Vector3 vect, Collision2D collision) 
        ContactPoint2D cp = collision.contacts[0];
        newVect = Vector3.Reflect(vect.normalized,cp.normal);
        rb.velocity = newVect * 20f;
    

    void OnCollisionEnter2D(Collision2D col)

    
        
        lastpos = transform.position;
        ReflectVector (lastVect,col);
                
        if (col.gameObject.CompareTag("hitboxP1") || col.gameObject.CompareTag("hitboxP2"))
        
            Reset();
            
             
      
    


  





解释东西并不是我的强项。因此,如果我的问题令人困惑,请务必告诉我,我将根据您认为令人困惑的内容,尽我所能重新格式化问题。提前谢谢你。

【问题讨论】:

【参考方案1】:

Random.Range 有两个定义:一个使用浮点数,一个使用整数。使用浮点数的方法会在最小值和最大值之间的任意位置生成一个随机浮点数(即带小数)。使用 ints 的生成一个随机整数(即整数),但最大值也是独占,这意味着它将生成一个介于最小值和小一之间的数字最大值。

例如,Random.Range(0, 10) 会生成一个介于 0 和 9 之间的数字。

在你的Nudge 函数中你写rand = UnityEngine.Random.Range(0, 2);。由于您使用 2 个整数作为参数,因此它将使用 Random.Range 的整数定义。因此该数字将是介于 0 和 1 之间的整数。由于它们都小于或等于 1,因此 if 语句将始终将 DirectionVector 设置为相同的值。

要解决此问题,您可以使用浮点数作为参数将其替换为 Random.Range 的浮点数定义。 IE。 rand = UnityEngine.Random.Range(0f, 2f);。现在它会生成一个介于 0 和 2 之间的数字,并且一半时间会小于或等于 1。

更多详情请见https://docs.unity3d.com/ScriptReference/Random.Range.html

【讨论】:

以上是关于重置后球轨迹完全相同(Unity)的主要内容,如果未能解决你的问题,请参考以下文章

重置浏览器地理位置值

openlayers应用“三”:百度地图纠偏

如何让核心动画显式动画的行为方式与隐式动画完全相同?

Unity基础学习六,网络同步

完全重置 Laravel 5 迁移的东西?

如何完全重置我的 TFS 设置?